2009-11-10 5 views
1

Je vais utiliser un datePicker plusieurs endroits dans mon application. Je ne veux pas "encombrer" chaque viewController avec les méthodes de délégation pour UIPickerViewDelegate et UIPickerDatasource, plus je ferais les mêmes méthodes de délégation encore et encore.Classe Wrapper personnalisée pour UIDatePickerView sur iPhone

Chaque fois que la datePicker est en jeu, son seul but est de glisser à mi-chemin de l'écran, laisser l'utilisateur sélectionner une date et ensuite disparaître à nouveau. Je pensais à un wrapper viewController (DatePickerViewController) qui implémentait les méthodes de délégué datePicker, puis effectuais un NSNotification avec la valeur que l'utilisateur sélectionnait, qui était de nouveau interceptée par viewController lors de l'instanciation de DatePickerViewController. Cela ferait de moi un datPicker découplé et laisserait le viewController instancier le datePicker ne rien savoir d'un DatePickerDelegate, mais sachez qu'il y aurait potentiellement une notification contenant un NSDate. Cela me semble rationnel, comme quelque chose que je ferais dans d'autres langues. Mais s'il vous plaît corrigez-moi si Im me creuser un trou ici :)

Comme j'ai commencé à casser cela, j'ai rencontré quelques difficultés, je ne suis pas très expérimenté en Objective C et Cocoa. Je peux construire un viewController dans lequel viewDidLoad présente une datePicker, en cours d'exécution juste cela se traduira par un écran blanc vide avec un datePicker dans la moitié inférieure de l'écran. Si j'utilise "presentModalViewController" du viewController qui instancie le DatePickerViewController (personnalisé), il glisse bien sûr et couvre tout l'écran. Je voudrais que l'utilisateur ait toujours la moitié de la vue visible. Un peu comme définir l'heure d'un événement dans l'application iCal. (sauf qu'ils poussent un nouveau viewController sur la pile). Ahh juste réalisé que ce que je veux dire est exactement comme le clavier quand il glisse et couvre la moitié de l'écran.

Donc je suppose que mon problème principal est: pouvez-vous construire un viewController qui se comporte comme le clavier lorsqu'il est ajouté à une vue. Mais faites tout cela dans le ViewController qui est ajouté au lieu du contrôleur en instanciant la vue.

Espoir il est logique :)

Merci

Répondre

1

(1) Mettre le sélecteur dans un modèle (edit: doit être modale) vue. C'est ainsi que le clavier est implémenté. (2) Le contrôleur/délégué du sélecteur doit uniquement contrôler la vue du modèle et le sélecteur.

(3) Dans le délégué créer deux propriétés telles que:

id * cible; Sélecteur theSelector;

et un procédé comme:

- (void) sendPickerResultsTo: (id) theTarget forSelector: (SEL) theSelector; (4) Avant d'afficher la vue du modèle du sélecteur, définissez la cible sur le contrôleur appelant et le sélecteur sur une méthode dans le contrôleur appelant. Vous pouvez configurer la méthode de sélection pour transmettre une quantité arbitraire de données.Cela ressemblerait à ceci:

- (void) pickerResults: (NSArray *) pickerResults; // pourrait passer toute valeur tant qu'elle est un objet

[Note: ceci est genre de chose que vous définissez un protocole si vous utilisez beaucoup]

(5) Lorsque vous avez la valeur du sélecteur juste avoir l'appel de délégué du sélecteur:

[self.target performSelector: theSelector withObject: anArrayOfPickerResults];

(5) Ajoutez la méthode appropriée à n'importe quel contrôleur qui doit évoquer la vue du sélecteur de modèle et définissez le contrôleur comme cible avant d'afficher la vue du sélecteur de modèle. Cela vous donnera une vue de sélecteur de modèle autonome que vous pouvez attacher à n'importe quelle vue et qui peut envoyer ses résultats à n'importe quel objet arbitraire qui implémente une méthode avec la bonne signature, c'est-à-dire implémente le protocole.

Ceci est essentiellement un do it yourself version de UIControls addTarget: action: forControlEvents:

+0

Salut TechZen Merci beaucoup :) Il y a quelques choses que je ne comprends pas; qu'est-ce qu'une "vue de modèle"? Je voudrais terminer avec CustomDatePicker.m et .h, l'instancier et l'ajouter à la vue actuelle fera glisser un datePicker et la sélection d'une date appellera un eventHandler sur le viewController en ajoutant le datePickerView. Cela signifierait que je devais seulement implémenter la méthode de gestionnaire et attendre la notification, pas conforme à tous les protocoles? Peut-être votre chemin est meilleur, mais un peu nouveau pour moi, pouvez-vous montrer un exemple là-bas. Merci encore. – RickiG

+0

Je pense qu'il veut dire vue modale - une vue qui, tout en haut, prend toutes les entrées. Les autres vues n'obtiennent pas d'événements d'interaction utilisateur. Une boîte de dialogue (erreur/avertissement) qui ne vous laissera pas cliquer sur autre chose jusqu'à ce que vous confirmiez qu'il s'agit d'un exemple de vue modale. –

+0

Merci Epsilon :) Je suis parti à la recherche de "Model View" en pensant qu'il y avait un type d'UIView magique que je n'avais pas encore vu (j'ai obtenu quelques milliards de résultats "Model-View-Controller") l'utilisateur de pouvoir taper ailleurs, comme le clavier, rien ne vous empêche de le faire. J'ai essayé d'incorporer un Picker dans une ActionSheet pour obtenir l'animation 'slide in' etc. mais cela bloque vraiment l'écran. Peut-être que je devrais essayer de construire la vue et faire ma propre animation. – RickiG

Questions connexes