2009-07-06 3 views
2

Ich habe eine Methode, die einen Absender akzeptiert und mit einem UIbutton aufgerufen wird. Wie bekomme ich dieses Objekt in eine UIImageView umgewandelt? Grundsätzlich wie benutze ich den Code für die Schaltfläche wieder.Casting Sender Parameter

- (IBAction)startClick:(id)sender { 
    button.animationImages = [NSArray arrayWithObjects: 
             [UIImage imageNamed:@"Pic_1.png"], 
             [UIImage imageNamed:@"Pic_2.png"], 
             [UIImage imageNamed:@"Pic_3.png"], 
             nil]; 
    [button setAnimationRepeatCount:1]; 
    button.animationDuration = 1; 
    [button startAnimating]; 
} 
+0

Dies ist ein Duplikat Ihrer früheren Frage: http: // stackoverflow.com/questions/1088481/sender-tag –

Antwort

3

Meine erste Antwort ist, dass es wahrscheinlich ein Fehler ist, dies zu tun. UIButton und UIImageView sind verschiedene Unterklassen von UIView (und UIButton ist eine Unterklasse von UIControl), so dass die einzigen Dinge, die sie gemeinsam haben UIView Methoden. Wenn sender wirklich ein UIButton ist, führt das Behandeln als UIImageView wahrscheinlich zu Fehlern, wie "unerkannter Selektor, der an Instanz gesendet wird" und dergleichen.

Im Allgemeinen ist eine sauberere Lösung, eine separate Methode, die die Aktion für eine UIImageView ist. (Im Gegensatz zu Java bevorzugen Objective-C und Cocoa den UI-Antwortcode nicht in einer einzigen Methode basierend auf dem Ereignistyp. Stattdessen organisieren Sie den Code logisch basierend auf dem Vorgang, der ausgeführt werden muss.)

Wenn Sie müssen Rufen Sie diese Methode von beiden Tasten und Bildansichten, können Sie die Logik wie folgt trennen:

- (IBAction) startClick:(id)sender { 
    if ([sender isKindOfClass:UIButton]) { 
    ... 
    } 
    else if ([sender isKindOfClass:UIImageView]) { 
    ... 
    } 
} 
+0

wenn ich - (IBAction) konnte ich hier nicht gepostet haben :) aber das Problem ist, dass diese Schaltfläche in einer anderen Klasse ist, ich kann keine IBAction dafür in dieser Klasse machen – chostDevil

+0

Es sollte " if ([Absender isKindOfClass: [UIButton class]]) {...} ". Mit eckigen Klammern und "Klasse" enthalten. – Priebe

1

Ich denke, Sie hätten dies getan.

UIButton *button = (UIButton*) id; 
// then do all you button code here. 

Dies sollte funktionieren. Andernfalls könnte es besser sein, die Funktion zu

zu ändern. So müssen Sie die Schaltfläche umwandeln möchten.

+0

Der letztere Vorschlag wird wahrscheinlich nicht funktionieren. IB-Aktionsmethoden haben immer den Rückgabetyp "IBAction" (der als void definiert ist) und der Parameter hat den Typ id. –

1

Haben Sie eine Steckdose für Ihre Taste? Ist der Button das einzige UI-Element, das -startClick:? Wenn ja, schreiben Sie dann die Aktion-Methode wie folgt aus:

- (IBAction)startClick:(id)sender { 
    NSParameterAssert(sender == self.startClickButton); 
    if (sender == self.startClickButton) { 
     UIButton *button = self.startClickButton; 
     [...] 
    } 
} 

Wenn Sie nicht über einen Auslass/Eigenschaft für die Schaltfläche haben, können Sie die Absender Klasse testen, und werfen falls.

- (IBAction)startClick:(id)sender { 
    NSParameterAssert([sender isKindOfClass: [UIButton class]]); 
    if ([sender isKindOfClass: [UIButton class]]) { 
     UIButton *button = (UIButton *)sender; 
     [...] 
    } 
} 

Schließlich ist es zulässig, (bei der Kompilierung) für jede Nachricht eine ID eingegeben Wert zu senden. (Sie erhalten eine Ausnahme zur Laufzeit, wenn der Empfänger nicht auf diese Nachricht reagiert.) Sie können jedoch die Punktsyntax nicht verwenden.

Wenn Sie also wissen, dass der Absender immer eine Schaltfläche ist, können Sie Ihre Methode ohne Casting schreiben. Sie müssen die Nachrichtensyntax anstelle der Punktsyntax verwenden.

[button setAnimationImages: [NSArray ...]]; 
[button setAnimationDuration: 1]; 

Dies ist wichtig zu verstehen - Punkt-Syntax entspricht Nachrichtensyntax senden - es ist nicht mystisch ist.

0

Sie können nur die Verwendung im Anschluss an die Button-Beschriftung zu erhalten und zu bestimmen, welche geklickt wurde:

NSLog (@ "geklickt hat:% @", [[Absender Titlelabel] Text]);

Ich hoffe, das hilft.

Suresh