2008-11-24 6 views
7

Ich habe zwei UIActionSheets und ich denke, dass ich sie mit einem Delegat (der UIViewController, der sie instanziiert) steuern. Der Delegat erfasst einen actionSheet-Aufruf und versucht herauszufinden, welcher der beiden das Ereignis ausgelöst hat.Verwenden eines Delegaten zum Verwalten von zwei UIActionSheets

Ich habe versucht, die modalView Titel zu erhalten zu unterscheiden, aber es scheint ungültig zu sein ...

sollte diese Arbeit?

Wenn nicht, gibt es eine andere Möglichkeit zu unterscheiden, welches UIActionSheet das Ereignis ausgelöst hat?

Oder muss ich zwei verschiedene Klassen erstellen, die für jedes UIActionSheet separate Delegaten sein werden?

Vielen Dank im Voraus.

Antwort

44

Ich denke, Sie brauchen die Tag Eigenschaft der UIActionSheet.

Etwas wie:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle ... ]; 
actionSheet.tag = 10; 
[actionSheet showInView:self.view]; 

Dann in Ihre Stellvertretung:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    switch (actionSheet.tag) { 
    case 10: 
     ... 
    } 
} 

Tag ist eine Eigenschaft von UIView und kann im Interface Builder für Komponenten eingestellt werden, dass es zu erscheinen. Ziemlich praktisch, obwohl ich es selbst nie in diesem Zusammenhang benutzt habe.

+1

Stephen schlug mich bis zum Schlag. Das ist genau die Technik, die ich benutze. Die Tag-Eigenschaft ist sehr praktisch für Fälle wie diese. Ich verwende es auch, wenn ich dynamisch UIs erzeuge, in denen die Anzahl der Subviews zur Laufzeit festgelegt wird. – Jablair

+0

Ausgezeichnet, das hat super funktioniert. Vielen Dank! –

+0

"Tag" ist ein fantastischer Tipp - großartig. – Fattie

9

Delegate-Methoden in Cocoa enthalten das sendende Objekt für diesen Zweck. Behalten Sie in Ihrer Controller-Klasse einen Verweis auf jedes Ihrer Aktionsblätter als Instanzvariable, und Sie können dies mit dem Parameter actionSheet in Ihren Delegate-Methoden vergleichen, um zu entscheiden, welche Aktionen Sie ausführen müssen.

Die Verwendung der Tag-Eigenschaft der Ansicht würde funktionieren, aber es wäre einfacher, einen Verweis zu behalten. Die Eigenschaft tag soll Ihnen helfen, eine Ansicht zu finden, wenn Sie durch eine Hierarchie von Unteransichten schauen und keinen Bezug zu dem von Ihnen benötigten Objekt haben.

6

Sie sollten den actionSheet-Zeiger verwenden, der wie Marc an die Methode des Delegaten übergeben wird. Zum Beispiel:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if(actionSheet == myDoSomethingActionSheet) { 
     if(buttonIndex == 0) { 
      [self doThingA]; 
      return; 
     } 
     if(buttonIndex == 1) { 
      [self doThingB]; 
      return; 
     } 
    } 
    if(actionSheet == myOtherActionSheet) { 
     if(buttonIndex == 3) { 
      [self doImportantThing]; 
      return; 
     } 
    } 
} 
Verwandte Themen