NSOpenPanel le titre.

tabliertablier Membre
janvier 2016 modifié dans Objective-C, Swift, C, C++ #1

Depuis que je suis en OSx10.11 je n'arrive plus à  mettre de titre ni à  openpanel, ni à  savepanel !


Qu'est-ce qui ne va pas dans ce code ?



- (NSString *)prise_Dossier:(NSString *)titre dos:(BOOL)newFold fich:(BOOL)fichier fol:(BOOL)folier


                    bun:(BOOL)paq typ:(NSArray *)lesTypes chem:(NSString *)chemin nom:(NSString *)nom


{


NSOpenPanel *choix_dossier ;


NSArray *les_fichiers ;


NSString *tete ;


int quoi ;


 


choix_dossier = [NSOpenPanel openPanel] ;             // créé l'objet openPanel


choix_dossier.canChooseFiles=fichier ;                // fichier si != 0


choix_dossier.canChooseDirectories=folier ;           // dossier si == 0


choix_dossier.resolvesAliases=NO ;                    // ne pas resoudre les alias


choix_dossier.allowsMultipleSelection=NO ;            // pas de sélection multiple


choix_dossier.treatsFilePackagesAsDirectories=paq ;   // ouvrir les bundles ?


tete = [NSString stringWithFormat:@%@ ?", localiser(titre)] ;


choix_dossier.title = tete ;                          // met le titre


choix_dossier.canCreateDirectories = newFold ;        // nouveau dossier possible


choix_dossier.allowedFileTypes=lesTypes ;


if (chemin!=nil) choix_dossier.directoryURL= [NSURL fileURLWithPath:chemin] ;  


 


quoi = [choix_dossier runModal] ;


 


if (quoi == NSFileHandlingPanelCancelButton) return (@"") ; // annulé par l'utilisateur


les_fichiers = choix_dossier.URLs ;                         // récupère la matrice des URLs


if ( les_fichiers.count == 0) return (@"") ;                // matrice vide ?


return [[les_fichiers objectAtIndex:0] path] ;              // retourne le dossier


}


 


Réponses

  • Peut-être parce que tu définis deux fois la variable tete dans ton source ? Une fois dans l'entête de la fonction et une fois dans le corps. Enfin, si j'arrive encore à  lire l'Objective-C.


     


     


     


     


  • Je pense que c'est correct:


    NSString *tete ;  // définit un pointeur de NSString


    tete = [NSString stringWithFormat:@%@ ?", localiser(titre)] ;  // attribue une valeur au NSString


     


    écrire: 


    NSString *tete = [NSString stringWithFormat:@%@ ?", localiser(titre)] ; // donne le même résultat


  • DrakenDraken Membre
    janvier 2016 modifié #4

    Essaye de retirer la ligne NSString *tete et regarde si ça marche :



    - (NSString *)prise_Dossier:(NSString *)titre dos:(BOOL)newFold fich:(BOOL)fichier fol:(BOOL)folier
    bun:(BOOL)paq typ:(NSArray *)lesTypes chem:(NSString *)chemin nom:(NSString *)nom
    {
    NSOpenPanel *choix_dossier ;
    NSArray *les_fichiers ;
    NSString *tete ; // <======== LIGNE A RETIRER
    int quoi ;

    choix_dossier = [NSOpenPanel openPanel] ; // créé l'objet openPanel
    choix_dossier.canChooseFiles=fichier ; // fichier si != 0
    choix_dossier.canChooseDirectories=folier ; // dossier si == 0
    choix_dossier.resolvesAliases=NO ; // ne pas resoudre les alias
    choix_dossier.allowsMultipleSelection=NO ; // pas de sélection multiple
    choix_dossier.treatsFilePackagesAsDirectories=paq ; // ouvrir les bundles ?
    tete = [NSString stringWithFormat:@%@ ?", localiser(titre)] ;
    choix_dossier.title = tete ; // met le titre
    choix_dossier.canCreateDirectories = newFold ; // nouveau dossier possible
    choix_dossier.allowedFileTypes=lesTypes ;
    if (chemin!=nil) choix_dossier.directoryURL= [NSURL fileURLWithPath:chemin] ;

    quoi = [choix_dossier runModal] ;

    if (quoi == NSFileHandlingPanelCancelButton) return (@"") ; // annulé par l'utilisateur
    les_fichiers = choix_dossier.URLs ; // récupère la matrice des URLs
    if ( les_fichiers.count == 0) return (@"") ; // matrice vide ?
    return [[les_fichiers objectAtIndex:0] path] ; // retourne le dossier
    }


  • J'avais déjà  fait, ça ne marche pas!


    La solution la plus courte étant (en supprimant tete) :


    choix_dossier.title = [NSString stringWithFormat:@%@ ?", localiser(titre)] ;

  • Le seul truc que je vois ce serait un souci autour de la fonction (ou macro) localiser()


    Que valent titre et localiser(titre) pendant l'exécution ?


  • klogklog Membre
    janvier 2016 modifié #7


     


    Essaye de retirer la ligne NSString *tete et regarde si ça marche :



    - (NSString *)prise_Dossier:(NSString *)titre dos:(BOOL)newFold fich:(BOOL)fichier fol:(BOOL)folier
    bun:(BOOL)paq typ:(NSArray *)lesTypes chem:(NSString *)chemin nom:(NSString *)nom
    {
    NSOpenPanel *choix_dossier ;
    NSArray *les_fichiers ;
    NSString *tete ; // <======== LIGNE A RETIRER
    int quoi ;

    choix_dossier = [NSOpenPanel openPanel] ; // créé l'objet openPanel
    choix_dossier.canChooseFiles=fichier ; // fichier si != 0
    choix_dossier.canChooseDirectories=folier ; // dossier si == 0
    choix_dossier.resolvesAliases=NO ; // ne pas resoudre les alias
    choix_dossier.allowsMultipleSelection=NO ; // pas de sélection multiple
    choix_dossier.treatsFilePackagesAsDirectories=paq ; // ouvrir les bundles ?
    tete = [NSString stringWithFormat:@%@ ?", localiser(titre)] ;
    choix_dossier.title = tete ; // met le titre
    choix_dossier.canCreateDirectories = newFold ; // nouveau dossier possible
    choix_dossier.allowedFileTypes=lesTypes ;
    if (chemin!=nil) choix_dossier.directoryURL= [NSURL fileURLWithPath:chemin] ;

    quoi = [choix_dossier runModal] ;

    if (quoi == NSFileHandlingPanelCancelButton) return (@"") ; // annulé par l'utilisateur
    les_fichiers = choix_dossier.URLs ; // récupère la matrice des URLs
    if ( les_fichiers.count == 0) return (@"") ; // matrice vide ?
    return [[les_fichiers objectAtIndex:0] path] ; // retourne le dossier
    }




     


    Procéder comme il le fait est tout à  fait légitime...




  • J'avais déjà  fait, ça ne marche pas!


    La solution la plus courte étant (en supprimant tete) :


    choix_dossier.title = [NSString stringWithFormat:@%@ ?", localiser(titre)] ;




     


    Si tu mets une chaine statique dans title (genre @un titre), tu as quelque chose ?

  • J'avais ajouté tete pour être sur que le  [NSString stringWithFormat:@%@ ?", localiser(titre)] ;  fonctionnait bien. Et c'est le cas.


     


    localiser est une simple macro:


     #define localiser(laKlef) [[NSBundle mainBundle] localizedStringForKey:laKlef value:@"" table:@Localized]


     


    Je vais essayer avec un string statique.




  • Procéder comme il le fait est tout à  fait légitime...




    Mon dieu, que je suis heureux de l'apparition de Swift !

  • LexxisLexxis Membre
    janvier 2016 modifié #11

    Le design des NSOpenPanel semble avoir changé depuis OS X 10.11 (si j'ai bien compris les Release Notes). Peut être est-ce la raison pour laquelle ton titre n'apparait pas ? (ou alors un bug). Au pire il y a toujours la propriété message qui, elle, semble correctement fonctionner.


  • Effectivement, il y a des modifications dans les openPanel !!! 


  • MalaMala Membre, Modérateur

    NSOpenPanel (New since WWDC Seed)


    A new property has been added to NSOpenPanel:
    /* Gets and sets the disclosure state of an accessory view in an NSOpenPanel.

    If hiding / disclosing an accessory view is not applicable this property will

    behave like a read only property.

    */

    @property (getter=isAccessoryViewDisclosed) BOOL accessoryViewDisclosed;In 10.11, most NSOpenPanels have adopted a design that was formerly reserved only for applications which adopted iCloud Documents support and this panel design was only used if iCloud Drive was turned on in System Preferences. This note will refer to the design as the “iCloud Open Panel Design” although the design is no longer limited to applications with iCloud Documents support. The iCloud Open Panel Design introduced an NSOpenPanel behavior where accessory views are hidden by default, and an “Options” button is available in the bottom controls of the panel to disclose / hide an accessory view by user action.  To prevent unexpected UI behavior changes in 10.11, NSOpenPanels in all applications linked before 10.11 which were not already using the iCloud Open Panel Design (meaning they did not adopt iCloud Documents support) will always disclose accessory views by default. The “accessory views disclosed by default" behavior matches prior shipping OS behavior where these applications would be using the "Non iCloud Open Panel Design." If your application is linked on 10.11 or later, accessory views set on an NSOpenPanel will be hidden by default whether or not your application adopted iCloud Documents support. If you find a default hidden accessory view to be undesirable, you can use the new property of NSOpenPanel to get and set the disclosure state. It is recommended you use this property before you run or begin an NSOpenPanel. This property is not preserved between panel runs, and the value of this property is also dependent on whether an accessory view has been set, and whether the panel design supports disclosure and hiding of accessory views.

    NSSavePanels do not use the iCloud open panel design and do not have disclosing / hiding accessory view functionality.  The accessory view in an NSSavePanel is always visible and cannot be hidden.

    NSOpenPanel (New since WWDC Seed)


    Prior to 10.11, sandboxed open and save panels always granted a sandbox extension to the result of a successfully completed panel, even if the client of the panel did not explicitly request the results via the methods that retrieve an url or urls. The pre 10.11 behavior was relied on by some client applications, which were inferring the panel results via other means. On 10.11, clients must explicitly request the results of the panel by calling the URL or URLs methods, or a sandbox extension will not be granted, and any attempt to access the resources pointed at the by the result of the completed panel will run into sandbox access restrictions. Please add calls to the URL or URLs method to your code, even if you think you already know the result.



    A première vue, je ne vois rien en rapport direct avec ton souci. Ca sent plutôt le bogue.

  • Apple dit clairement que le design de OpenPanel est changé, mais pas celui de savePanel. C'est ce que j'observe !


    Je ne trouve pas comment mettre off le "iCloud Drive" dans les préférences système.


  • MalaMala Membre, Modérateur


    Apple dit clairement que le design de OpenPanel est changé, mais pas celui de savePanel. C'est ce que j'observe !




    Qu'il est évolué est une chose mais je ne vois nul par question que le title n'est plus géré. Je pense que c'est un oubli de transition.

  • Mon problème est d'indiquer à  l'utilisateur  ce qu'il doit ouvrir. J'ai trouvé deux trucs qui marchent:


    1 comme le dit Lexxis, message marche parfaitement. Le texte arrive en haut de la fenêtre à  la place du titre !


    2 l'accessoryView marche également pour afficher un texte en bas de la fenêtre. Sous réserve d'avoir validé son affichage par:


         lopenPanel.accessoryViewDisclosed = NO


     


    Par contre je n'arrive toujours pas à  afficher un titre dans un openPanel. j'utilise donc "message".


    Le savePanel affiche correctement les titres, les messages et les accessoryView 


Connectez-vous ou Inscrivez-vous pour répondre.