2009-05-20 14 views
30

Gdy IBAction nazywa się:Get tekst przycisku z IBAction - iPhone

-(IBAction) onClick1: (id) sender; 

Co jest przekazywana w nadawcy? Ponieważ jest podłączony przez IB, nie jestem pewien. Moje pytanie brzmi: jak uzyskać tekst przycisku, który ma być przekazanym obiektem (najprawdopodobniej NSString), aby móc go nazwać wewnątrz implementacji działania.

-(IBAction) onClick1: (id) sender { 
    NSLog(@"User clicked %@", sender); 
    // Do something here with the variable 'sender' 
} 

Odpowiedz

25

To rzeczywiście:

-(IBAction) onClick1: (id) sender { 
    NSLog(@"User clicked %@", sender); 
    // Do something here with the variable 'sender' 
} 

sender nie jest NSString, to od rodzaju id. To tylko kontrola, która wysłała wydarzenie. Jeśli więc twoja metoda zostanie uruchomiona po kliknięciu przycisku, zostanie wysłany obiekt, który został kliknięty. Można programowo uzyskać dostęp do wszystkich standardowych metod i właściwości.

+0

Ah, naprawiono. Stamtąd muszę tylko wywołać metodę getTitle? Po tym, jak rzuciłem identyfikator jako UIButton oczywiście? – Organiccat

+2

Nie musisz nawet go przesyłać. Takie jest piękno przekazywania wiadomości w przeciwieństwie do wywoływania metod w dynamicznym języku. :-) –

+1

Och i nie sądzę, że getTitle jest wiadomością, której szukasz. Zrobiłbyś [nadawca currentTitle], jak powiedział Matt w swojej odpowiedzi. –

2

Nadawca powinien być zdefiniowany jako identyfikator typu, nie int lub NSString. Nadawca jest rzeczywistym obiektem, który wywołuje metodę; jeśli podłączysz go do przycisku, będzie to UIButton, jeśli jest to pole tekstowe, UITextField. Możesz użyć tego do pobrania informacji z formantu (na przykład aktualnej wartości ciągu pola tekstowego) lub porównać go ze zmienną instancji IBOutlet, jeśli masz wiele kontrolek podpiętych do tej samej metody działania.

60

Sterowanie, które zainicjowało akcję, powinno być sender. Jednak nie powinieneś przyjmować jego typu i zamiast tego powinien on być zdefiniowany jako id. Zamiast sprawdzać klasy obiektu w rzeczywistym sposobie następująco:

- (IBAction)onClick1:(id)sender { 
    // Make sure it's a UIButton 
    if (![sender isKindOfClass:[UIButton class]]) 
     return; 

    NSString *title = [(UIButton *)sender currentTitle]; 
} 
+0

Nie trzeba przesyłać nadawcy do UIButton. –

+5

To prawda, nie musisz. Wolę odrzucić moje identyfikatory, aby kompilator mógł mnie ostrzec, gdy próbuję wysłać wiadomość do niewłaściwego rodzaju obiektu. –

+0

Wykrywanie funkcji jest zdecydowanie dobre. – Joseph

2

można po prostu użyć następujących czynności, aby uzyskać przycisk etykietę i ustalić, który z nich został kliknięty:

NSLog(@"Clicked button: %@",[[sender titleLabel] text]); 

Aby odpowiedzieć na to pytanie , id jest obiektem z IB.

+0

[Nadawca titleLabel] nie jest dozwolona, ​​jeśli nadawca jest typu id – GameLoading

14
-(IBAction)onClick:(id) sender { 
    UIButton *btn = (UIButton *)sender; 

    //now btn is the same object. And to get title directly 
    NSLog(@"Clicked button: %@",[[btn titleLabel] text]); 
} 
10

Wystarczy napisać następujący kod

-(IBAction) getButtonTitle:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    NSString *buttonTitle = button.currentTitle; 
    NSLog(@"Button Title %@",buttonTitle); 

} 

to wszystko ... masz zrobić !!!

1

Aby pobrać tekst z przyciskiem:

NSLog(@"Date::%@",[DateButton titleForState:UIControlStateNormal]);   

Tutaj DateButton to nazwa UIButton.

Powiązane problemy