2010-09-21 4 views
2

J'essayais d'utiliser IB d'une manière légèrement différente que je suis habitué et je ne peux pas le faire fonctionner en étendant l'approche normale que j'utilise, en traitant avec IB. Au lieu de créer un nouveau UIViewController et de générer la vue XIB pour moi et tout ce qui est lié par Xcode, je voudrais juste construire un petit View XIB (320x40px) et le lier à mon ViewController déjà existant. Je commence par créer un nouveau fichier dans Xcode, sélectionnez "afficher XIB". Ensuite, j'ouvre IB et j'ajoute des étiquettes, etc. à la vue et je mets le "Propriétaire de fichiers" à mon ViewController existant. Dans mon ViewController existant, j'ai défini les IBOutlets pour les étiquettes, etc. Je retourne à IB et raccorde les UILabels à mes prises dans "Files Owner".UIView construire dans Interface Builder connecté à mon UIViewController personnalisé

Je pense maintenant que j'ai une référence aux étiquettes à l'intérieur du XIB, dans mon viewController. Ce n'est pas vraiment l'approche que je voudrais, je ne vois pas la nécessité pour mon viewController d'avoir une référence aux étiquettes à l'intérieur de ma vue.

Comment je fais habituellement dans le code:

Mon ViewController contrôle un tas de UIViews entièrement dans le code et qui les instancier par:

UIView *customView = [[CustomView alloc] initWithFrame:aFrame]; 
[customView setTag:MY_CUSTOM_VIEW]; 
[customView setDelegate:self]; 
[self.view addSubView:customView]; 
[customView release]; 

Après cela, j'accéder aux étiquettes, boutons etc. à partir de mon contrôleur en utilisant le [(UILabel*)[[self.view viewWithTag:MY_CUSTOM_VIEW] myLabel] [email protected]"Hello, World"]; mon UIViewController implémenter toutes les méthodes que le protocole customView requis.

Comment obtenir cette fonctionnalité avec IB

Dois-je d'abord construire une classe MyCustomView extension de la classe UIView, faites-le tenir tous mes IBOutlets, mis MyCustomClass en tant que propriétaire des fichiers et instancier alors que comme indiqué ci-dessus? Est-il acceptable d'avoir une vue agissant en tant que viewController pour la vue IB et comment relayer les actions à mon "vrai" viewController? Ce que je voudrais faire, c'est d'instancier et de disposer plusieurs UIViews dans mon code UIViewControllers, mais j'ai la liberté de concevoir certains de ces UIViews dans IB. Toutes les informations que je peux trouver concernent le standard "construire un UIViewController avec un XIB pour la vue" ou "Comment construire des bibliothèques de composants IB".

je l'espère, il est logique et merci pour toute l'aide donnée :)

Répondre

1

Vous pouvez créer ne importe quelle structure vue que vous voulez dans Interface Builder et instancier ensuite à l'aide de la classe UINib. Une fois que vous créez un objet UINib, il charge le contenu de la plume et les conserve. Ensuite, chaque fois que vous lui envoyez le message instantiateWithOwner:options:, il va instancier les objets contenus dans le xib et retourner un tableau avec les vues de niveau supérieur. Vous pouvez ensuite ajouter ces vues à la hiérarchie de vos vues et les gérer comme toute autre vue que vous avez créée par programmation. Si vous conservez l'objet UINib (en tant que propriété par exemple), vous pouvez instancier le contenu encore et encore, ce qui permet à votre xib d'être utilisé comme un modèle.Pour une solution de contournement pré-iOS 4, voir my recent question and answer.

+0

Merci Toastor, cela ressemble à ce dont j'ai besoin. J'ai remarqué dans la documentation qu'il s'agit d'un ajout iOS 4.0, cela ne fonctionnera-t-il pas sur un appareil fonctionnant sous 3.x? En outre, la documentation ne mentionne pas comment vous construiriez le NIB (traitant des sorties etc.) si une vue de NIB doit être emballée. Pourriez-vous me pointer vers une ressource où je pourrais voir comment cette fonctionnalité est mise en œuvre. Merci encore. – RickiG

+0

Je suis désolé, je ne connais aucune ressource, j'ai inventé des choses moi-même. Dans votre plume, vous pouvez spécifier le propriétaire du fichier comme d'habitude et faire les connexions appropriées. Ils seront cependant les mêmes pour toutes les instances, vous devez donc définir des balises sur vos nouvelles vues juste après l'instanciation pour pouvoir les distinguer plus tard. En ce qui concerne le remplacement pré-iOS 4 - j'ai eu la même question exacte. Je mettrai à jour ma réponse avec un lien vers la question et répondrai tout de suite. – Toastor

+0

Vous le faites comme vous le feriez pour n'importe quelle plume. Disons que vous avez un viewcontroller et ajoutez le contenu de la plume à la vue du VC. Le VC a une méthode '- (IBAction) buttonPressed: (id) expéditeur;'. Si dans votre plume vous ajoutez un bouton et que vous définissez le propriétaire des fichiers sur votre sous-classe VC, vous pouvez connecter l'action au bouton comme d'habitude. La méthode d'action sera appelée lorsque vous appuyez sur N'IMPORTE QUELLE instance de ce bouton cependant, c'est pourquoi vous avez besoin de balises si vous instanciez la plume plus qu'une seule fois. Sinon, vous ne saurez pas quel bouton a été touché. – Toastor

Questions connexes