Question

J'ai lu Apple « Votre première application iOS » guide et tout ce qu'il me semble clair pour. Cependant, lorsque je tente de comprendre comment un modèle d'application iOS base-View fourni dans XCode fonctionne, je rencontre quelques énigmes intéressantes.

Je comprends que l'application obtient le nom du fichier principal de pointe (en général, le MainWindow.xib) forment le fichier * -Info.plist. Ce que je ne comprends pas, comment le savoir XCode fichier nib qui est associé au contrôleur qui est créé avec ce modèle d'application-View par défaut. Dans le guide, vous commencez par l'application de fenêtre, et vous « devez écrire » quelque chose comme:

MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

[self setMyViewController:aViewController];

ce qui est logique parfaite. Cependant, il se trouve que dans le modèle d'application iOS à base de vue, il n'y a pas une telle chose, et que cette spécification de pointe n'a pas été réellement nécessaire en premier lieu, tant que vous avez créé votre sous-classe UIViewController avec l'option « Avec XIB pour l'interface utilisateur " vérifié. Ma question est, comment XCode sait qui nib est associée à ce contrôleur, à savoir est-il stocke cette connexion dans certains fichiers, ou peut-être par une sorte de convention (même nom pour le contrôleur et le fichier nib, peut-être)? De plus, où est-ce que « Loaded de « MyViewBasedAppController » » de sous-titres de l'avis du constructeur Interface de contrôleur au sein MainWindow.xib? Il est certainement pas là quand j'ajoute le contrôleur à la main, donc je suis curieux de ce que la magie ne XCode pas derrière mon dos, quand je pense que je suis juste choix d'un modèle simple de code.

Était-ce utile?

La solution

Si vous regardez dans l'info cible (cliquez deux fois sur la cible pour soulever cette question), l'onglet 'Propriétés, vous verrez le nom du fichier principal Nib. Les mots de Nib »et « Xib » sont interchangeables à ces fins; Xib est juste une nouvelle alternative pour Nib.

Il sera frais « MainWindow » du modèle. Si vous ouvrez MainWindow.xib vous verrez que là est un objet appelé « App délégué [nom du projet] », et si vous présentez l'inspecteur et de vérifier sous l'onglet « i », vous verrez le type de classe qui est nommé en haut. Si vous cochez l'onglet Connexions (droite face flèche), vous verrez que le propriétaire du fichier (qui est le UIApplication lui-même) a sa propriété « délégué » joint.

Vous verrez également qu'il a une sortie appelée « viewController ». Qui est attaché à un autre objet dans le xib appelé '[nom du projet] View Controller. Vérifiez le type là-dessus et vous verrez que c'est le contrôleur type de vue que Xcode a ajouté à votre projet. En regardant ses attributs (le premier onglet dans l'inspecteur, avec le graphique du curseur), vous verrez également qu'un fichier nib séparé est spécifié comme contenant ses principaux détails.

Pour l'amour de l'argument, supposons que j'ai appelé mon projet « NibTest » et n'a apporté aucune modification.

Lors de l'exécution, l'appareil charge Info.plist. Là-dedans, il voit que le délégué est de type NibTestAppDelegate. Donc, il va instancier une instance de la classe NibTestAppDelegate et définir la propriété délégué du UIApplication à lui.

Il va alors voir de MainWindow.nib que NibTestAppDelegate a un membre nommé viewController de type NibTestViewController. Donc, il va créer une instance de cela et définir la propriété viewController sur l'instance NibTestAppDelegate il vient d'être créé à lui.

Pour ce que ça va ouvrir l'autre et xib continuer à faire le même genre de mesures.

Objective-C a une durée d'exécution entièrement réfléchissante, de sorte que vous pouvez instancier des objets par leur nom de classe lors de l'exécution. Ceci est l'une des différences entre Objective-C et C ++, par exemple.

Xcode ne génère pas de code caché ou se fondant sur les conventions de noms cachés. L'ensemble est figuré dehors lors de l'exécution par le système d'exploitation.

EDIT: par exemple, à la place de votre exemple:

    MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Vous pouvez réellement faire:

    MyViewController *aViewController = [[NSClassFromString(@"MyViewController") alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Ils fonctionnent de manière identique existe aussi longtemps que MyViewController dans le programme ou dans le temps d'exécution plus large.

Vous pourriez encore passer tout autre objet chaîne que vous aimez NSClassFromString. Même demander à l'utilisateur si vous voulez (bien que ce serait une très mauvaise idée pour des raisons de sécurité).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top