2010-03-02 17 views

risposta

16

È possibile utilizzare il metodo -nextResponder per farlo. Secondo http://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/nextResponder, "UIView implementa questo metodo restituendo l'oggetto UIViewController che lo gestisce (se ne ha uno) o la sua superview (se non lo fa)"

+4

Questa è una buona soluzione, ma le visualizzazioni non dovrebbero mai avere la necessità di accedere direttamente al loro controller. Ecco perché abbiamo delegati. – Sulthan

5

UIView non ha riferimento a UIViewController da default.You può aggiungere al tuo sottoclasse UIView e impostare quando si creano UIView in UIViewController.

Se siete alla ricerca di genitore del viewcontroller, ogni UIViewController ha proprietà parentViewController, ma se si vuole accedere a questa da UIView è necessario per raggiungere la vostra UIViewController prima.

Si può vedere ad esempio come creare riferimento alla vostra UIViewController nella sottoclasse di UIView e come/dove per configurarlo in View Controller Programming guide for iPhone, vedere la sezione creazione della vista di programmazione in Definizione di una classe personalizzata controller View, qui è l'esempio, per maggiori dettagli vedi l'esempio Metronome collegato.

- (void)loadView { 

    self.wantsFullScreenLayout = YES; 

    MetronomeView *view = [[MetronomeView alloc] 
          initWithFrame:[UIScreen mainScreen].applicationFrame]; 
    view.metronomeViewController = self; 
    self.view = view; 
    self.metronomeView = view; 

    [view release]; 
} 

In intestazione:

@interface MetronomeView : UIView { 
    MetronomeViewController *metronomeViewController; 
... 
+0

Molte grazie per la risposta! – reinaldoluckman

+1

si prega di consultare la risposta su -nextResponder. –

1

Non si deve salvare il riferimento al controller di visualizzazione come potrebbe cambiare in modo dinamico. Attraversa la catena di risposta ogni volta che ne hai bisogno.

2

È possibile utilizzare

[(MyParentViewController *)[[self.view superview] nextResponder] doSomething]; 
+0

La documentazione dice "UIView implementa questo metodo restituendo l'oggetto UIViewController che lo gestisce (se ne ha uno) o la sua superview (se così non fosse);". Quindi se la vista è nidificata in profondità, nextResponder restituirà semplicemente la superview della superview (non un controller) e causando quindi un errore (selettore sconosciuto). D'altra parte se la vista è la vista del controllore, potrebbe restituire un altro controller (ad esempio il controller è in navigationController, quindi la vista padre del controllore è navigationController's view e nextResponder restituirà navigationController). Ecco perché ho downvoted – JakubKnejzlik

1

È possibile utilizzare il seguente:

UIViewController* yourViewController = 
         (UIViewController*)[(YourAppDelegate*) 
         [[UIApplication sharedApplication] delegate] viewController]; 
Problemi correlati