2009-01-16 15 views

Antwort

21
:

würde
@interface Controller : NSObject { 
    UIButton *_replyToSender; 
    UIButton *_replyToAll; 
} 
- (void)buttonClicked:(id)sender; 
@end 

@implementation Controller 
- (void)buttonClicked:(id)sender { 
    if (sender == _replyToSender) { 
     // reply to sender... 
    } else if (sender == _replyToAll) { 
     // reply to all... 
    } 
} 
@end 

Die zweite Möglichkeit, in einer Art und Weise, wie implementiert wird:

Die erste (meine bevorzugte Art und Weise, aber es ist leicht, das Gegenteil zu behaupten) würde wie so umgesetzt werden

Die Methode replyAll sollte den (ID-) Absender akzeptieren. Wenn ein UIButton das Ereignis ausgelöst hat, wird dasselbe UIButton als Absender übergeben. UIButton verfügt über eine Eigenschaft "tag", an die Sie Ihre eigenen benutzerdefinierten Daten anhängen können (ähnlich wie bei .net winforms).

So sollten Sie Ihre Veranstaltung hook up mit:

[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside]; 
replyAllBtn.tag=15; 

handhaben es dann mit:

(void) ReplyAll:(id)sender{ 
    NSInteger *tid = ((UIControl*)sender).tag; 
    //... 
+0

hey danke das ist genau was ich wollte ...... Hinzufügen des Tags funktioniert gut, aber in der Controller, wo die Funktion replyAll definiert ist { NSInteger * tid = (* NSInteger) sender.tag; } gibt eine Fehlermeldung, „Anfrage für Mitglied-Tag in etwas keine Struktur oder Union“ :( – Vijayeta

+1

Danke für diese Aufklärung, Rob. Ich habe versucht, genau herauszufinden, wie ich das gleiche Verhalten zu erreichen, würde Vijayeta suchte: @Vijayeta: Der Absender ist der Button selbst, also glaube ich, dass du "((UIControl *) sender) .tag;" ausprobieren musst. Beachte, dass du das Darstellungsobjekt in runde Klammern setzen musst, bevor du auf den Link zugreifen kannst Tag-Eigenschaft – LucasTizma

+1

@Vijayeta:.. '.tag' eine ganze Zahl ist, nicht ein Zeiger auf eine ganze Zahl' NSInteget tid = sender.tag' – user102008

1

Das in Cocoa verwendete MVC-Modell funktioniert anders. Im Grunde ist die Idee, dass ein Steuerelement (= Ansicht) wie eine Schaltfläche nur eine Funktion wissen lässt, dass es gedrückt wurde, ohne zu wissen, was das bedeutet. Die Funktion muss dann alle Dynamiken und Abhängigkeiten kennen. In Ihrem Fall muss die Funktion den Parameter finden. Um dies zu erreichen, binden Sie andere Objekte an die Funktion (= Controller).

Ich schlage vor, Sie lesen ein paar Cocoa Tutorials zuerst, wenn Sie mit der iPhone-Programmierung weiterkommen wollen. der einzige Parameter aufgerufen, um die tatsächliche Kontrolle, dass es sich um eine Aktion jemals erhält So

- (void) ReplyAll:(id)sender; 

:

2

Eine Auswahlfunktion wird in der Regel als solche definiert werden. Sie könnten einfach eine Eigenschaft zu Ihrem Steuerelement hinzufügen, die in Antwort gelesen werden kannAll

+0

Hii, Danke für die prompte Antwort, ein Zweifel, den ich habe, ist, da das Steuerelement eine Instanz von UIButton ist, wie kann ich irgendeine Eigenschaft hinzufügen ??? Vielleicht ist die Frage zu naiv ... aber ich verstehe es nicht wirklich. – Vijayeta

0

Es gibt ein paar gute Möglichkeiten, dies zu tun. Die beiden am häufigsten implementierten Methoden bestehen darin, dass der Controller (der die Aktion empfängt) über mögliche Absender informiert ist oder dass der Absender selbst über eine Methode verfügt, die Sie verwenden, um das richtige Verhalten zu ermitteln.

typedef enum { 
    ReplyButtonTypeSender = 1, 
    ReplyButtonTypeAll, 
} ReplyButtonType; 

@interface Controller : NSObject { 
} 
- (void)buttonClicked:(id)sender; 
@end 

@interface MyButton : UIButton { 
} 
- (ReplyButtonType)typeOfReply; 
@end 

@implementation Controller 
- (void)buttonClicked:(id)sender { 
    // You aren't actually assured that sender is a MyButton, so the safest thing 
    // to do here is to check that it is one. 
    if ([sender isKindOfClass:[MyButton class]]) { 
     switch ([sender typeOfReply]) { 
      case ReplyButtonTypeSender: 
       // reply to sender... 
       break; 
      case ReplyButtonTypeAll: 
       // reply to all... 
       break; 
     } 
    } 
} 
@end 
2

Wenn Sie einen int-Wert gesendet werden soll, stellen Sie den Tag der Taste = die int Wert, den Sie übergeben möchten. Dann können Sie auf den Tag-Wert der Schaltfläche zugreifen, um den gewünschten int zu erhalten.

NSInteger ist kein Zeiger. Versuchen Sie diese

NSInteger tid = sender.tag; 
+0

ich habe versucht, tht selbst aber der Fehler bezüglich nicht den Objekttyp, ist es nicht den Typ des Senders eingeben, das ist der Fehler sagt "Anfrage für memb Er-Tag in etwas nicht einer Struktur oder Union " – Vijayeta

+0

Ist der Absender ein Objekt einer benutzerdefinierten Klasse, die Sie deklariert haben? In diesem Fall versuchen Sie [sender tag] anstelle von sender.tag. Das funktioniert normalerweise. – lostInTransit

+0

ja, habe es versucht und es wrks .. danke – Vijayeta

Verwandte Themen