2011-03-02 1 views
1

Je n'ai pas complètement compris le mécanisme de délégation dans monotouch. Quelqu'un peut-il m'aider à comprendre ce concept?Monotouch: comprendre le modèle de mécanisme délégué

La question est simple. Je vais essayer de cartographier ce que j'ai fait dans l'Objectif C de Monotouch. Par exemple, supposons que j'ai créé un UIPopoverController dans Objective C à MyController. En Objective C le code est le suivant:

@interface MyController : UIViewController <UIPopoverControllerDelegate> { 
    // ... 
} 
// ... 
@end 

intérieur MyController je peux istantiate un UIPopoverController comme ce qui suit:

UIPopoverController *popover = // ... 
popover.delegate = self; 

et enfin les méthodes utilisées dans le délégué.

Alors, qu'en est-il de Monotouch?

Grâce à ce code, je peux istantiate l'intérieur UIPopoverControllerMyController classe qui étend UIViewController l'intérieur d'un gestionnaire d'événements TouchUpInside spécifique:

popover = new UIPopoverController(new CustomController()); 
popover.PopoverContentSize = new SizeF(200f, 200f); 
popover.PresentFromRect(button.Frame, containerForButtonView, UIPopoverArrowDirection.Left, true); 

post-scriptum Un aspect important est de mettre la référence popover en tant que classe membre et non en tant que variable locale dans le gestionnaire car le GC monotouch fonctionne bien !!!

Merci à l'avance.

+0

Ma première solution fonctionne. J'ai implémenté un CustomPopoverController qui étend UIPopoverControllerDelegate. Ensuite, j'ai ajouté en tant que popover.delegate une instance de ce contrôleur. Est-il possible de faire comme le délégué ** MyController ** ou ** CustomController **? –

+0

À quoi ressemblait votre solution? Les seuls événements que je peux voir sont 'DidDismiss' et' WillReposition' ... Pas tellement. – testing

Répondre

3

Cela a vraiment plus à voir avec C# qu'avec MonoTouch lui-même. Dans MonoTouch, UIPopoverControllerDelegate est une classe et C# n'autorise pas l'héritage multiple. Vous ne pouvez donc pas traduire le code un à un avec Obj-C. Il y a un moyen plus facile à bien (le code ci-dessous compile, mais évidemment ne fonctionne pas):

public class MyController: UIViewController { 
     public void mymethod(){ 
      var popover = new UIPopoverController(); 
      popover.DidDismiss += HandlePopoverDidDismiss; 
      popover.PopoverContentSize = new SizeF(200f, 200f); 
      popover.PresentFromRect(button.Frame, containerForButtonView, UIPopoverArrowDirection.Left, true); 
     } 

     void HandlePopoverDidDismiss (object sender, EventArgs e) 
     { 
      Console.WriteLine("Working!"); 
     } 
    } 
} 

Comme vous pouvez le voir, vous pouvez ajouter un gestionnaire d'événement pour l'événement DidDismiss dans le popover, qui fera quoi tu veux. En général, tous les événements traités dans Obj-C par le délégué dans tous les contrôles peuvent être utilisés de cette manière. Vous pouvez également écrire la méthode en ligne, comme ceci:

popover.DidDismiss += delegate { 
    //dosomething 
}; 

Espérons que c'est ce que vous cherchez.

2

Ceci ne répond pas à votre question spécifique à votre UIPopovercontroller Je pense que vous trouverez this link from the Monotouch Docs useful. Il explique les différences entre les délégués d'Objective-C et les délégués C# en relation avec Monotouch. En ce qui concerne votre problème spécifique, je n'ai pas eu le temps de préparer un test rapide pour le comprendre complètement mais j'ai pensé que je publierais ce lien afin que vous ayez quelque chose à lire en attendant!

Questions connexes