Jak programowo dodać akcję do przycisku w xcode


105

Wiem, jak dodać IBAction do przycisku, przeciągając go z kreatora interfejsu, ale chcę dodać akcję programowo, aby zaoszczędzić czas i uniknąć ciągłego przełączania się w tę iz powrotem. Rozwiązanie jest prawdopodobnie bardzo proste, ale po prostu nie mogę znaleźć odpowiedzi, kiedy je przeszukuję. Dziękuję Ci!

Odpowiedzi:


222

Spróbuj tego:

Szybki 4

myButton.addTarget(self,
                   action: #selector(myAction),
                   for: .touchUpInside)

Cel C

[myButton addTarget:self 
             action:@selector(myAction) 
   forControlEvents:UIControlEventTouchUpInside];

Możesz znaleźć bogate źródło informacji w dokumentacji Apple. Spójrz na dokumentację UIButton, pokaże, że UIButton jest potomkiem UIControl, który implementuje metodę dodawania celów .

-

Trzeba zwrócić uwagę na to, czy doda okrężnicy lub nie później niż myActionw action:@selector(myAction)

Oto odniesienie .


Co zrobić, jeśli chcę przekazać parametr do selektora po naciśnięciu mojego przycisku (np. Mam przycisk wewnątrz UITableViewCell i chcę przekazać obiekt w tej komórce po naciśnięciu przycisku komórki)?
acecapades

1
@acecapades Myślę, że łączysz dwie rzeczy. Nie możesz dołączyć parametru, tak jak w przypadku performSelector. Wzorzec działania używany przez element potomny UIControl UIButton polega na powiadamianiu określonego celu za pomocą określonego selektora, gdy zostanie wyzwolone zdarzenie controlEvent. Kiedy tak się stanie w twoim przypadku, możesz przejść do superwizji, aby zobaczyć, kto hermetyzuje twój przycisk i zapytać o metodę rozwiązania komórki w celu modelowania relacji, a następnie zrób z tym, co chcesz.
Nick Weaver

1
Widzę. To ma sens. Myślę, że rozumiem, co mówisz. Dzięki za cynk, Nick!
acecapades

czy ktoś może to szybko przetłumaczyć?

23

Szybka odpowiedź:

myButton.addTarget(self, action: "click:", for: .touchUpInside)

func click(sender: UIButton) {
    print("click")
}

Dokumentacja: https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget


Po co „:” po „kliknięciu” w wywołaniu UIControl.addTarget?
dumbledad

1
Selektory mają :symbol zastępczy dla argumentów funkcji. Ponieważ clickprzyjmuje senderargument, jest on zastępowany znakiem a :w ciągu selektora.
Etan,

To działało ostatnio dla mnie w Swift 3. button.addTarget (self, action: #selector (ViewController.click), dla: UIControlEvents.touchUpInside) func click () {print ("click")} Dzięki @Glauco Neves za wskazanie nam w dół właściwą ścieżką
uplearnedu.com

14
CGRect buttonFrame = CGRectMake( 10, 80, 100, 30 );
        UIButton *button = [[UIButton alloc] initWithFrame: buttonFrame];
        [button setTitle: @"My Button" forState: UIControlStateNormal];
        [button addTarget:self action:@selector(btnSelected:) forControlEvents:UIControlEventTouchUpInside];
        [button setTitleColor: [UIColor redColor] forState: UIControlStateNormal];
[view addSubview:button];

czy można dodać 2 lub więcej akcji?
ErasmoOliveira

9

Spróbuj tego:

najpierw zapisz to w swoim pliku .h programu viewcontroller

UIButton *btn;

Teraz zapisz to w swoim pliku .m kontrolerów widoku viewDidLoad.

btn=[[UIButton alloc]initWithFrame:CGRectMake(50, 20, 30, 30)];
[btn setBackgroundColor:[UIColor orangeColor]];
//adding action programatically
[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];

zapisz tę zewnętrzną metodę viewDidLoad w pliku .m kontrolera widoku

- (IBAction)btnClicked:(id)sender
{
   //Write a code you want to execute on buttons click event
}

8
 CGRect buttonFrame = CGRectMake( x-pos, y-pos, width, height );   //
 CGRectMake(10,5,10,10) 

 UIButton *button = [[UIButton alloc] initWithFrame: buttonFrame];

 button setTitle: @"My Button" forState: UIControlStateNormal];

 [button addTarget:self action:@selector(btnClicked:) 
 forControlEvents:UIControlEventTouchUpInside];

 [button setTitleColor: [UIColor BlueVolor] forState:
 UIControlStateNormal];

 [view addSubview:button];




 -(void)btnClicked {
    // your code }

6

Dla Swift 3

Najpierw utwórz funkcję dla akcji przycisku, a następnie dodaj funkcję do celu przycisku

func buttonAction(sender: UIButton!) {
    print("Button tapped")
}

button.addTarget(self, action: #selector(buttonAction),for: .touchUpInside)

3
UIButton *btnNotification=[UIButton buttonWithType:UIButtonTypeCustom];
btnNotification.frame=CGRectMake(130,80,120,40);
btnNotification.backgroundColor=[UIColor greenColor];
[btnNotification setTitle:@"create Notification" forState:UIControlStateNormal];
[btnNotification addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnNotification];


}

-(void)btnClicked
{
    // Here You can write functionality 

}

proszę podać kilka komentarzy wyjaśniających, w jaki sposób może pomóc twoja próbka.
Nogard,

UIButton * btnNotification = [UIButton buttonWithType: UIButtonTypeCustom]; btnNotification.frame = CGRectMake (130,80,120,40); // Ustawienie ramki przycisku btnNotification.backgroundColor = [UIColor greenColor]; [btnNotification setTitle: @ "create Notification" forState: UIControlStateNormal]; // Ustaw tytuł dla przycisku [btnNotification addTarget: self action: @selector (btnClicked) forControlEvents: UIControlEventTouchUpInside]; // dodaj Target addSub button [self. btnNotification];} - (void) btnClicked {// Tutaj możesz napisać funkcjonalność}
user2677311

- (void) btnClicked {// tutaj cokolwiek chcesz, możesz ustawić akcję dla przycisku // Przykład: przejdź do następnego viewcontroller nextviewController * nextPage = [nextviewControllerocation] init]; [self.navigationController pushviewcontroller: nextPage animated: YES]; }
user2677311

2

UIButtondziedziczy z UIControl. Zawiera wszystkie metody dodawania / usuwania akcji: odwołanie do klasy UIControl . Zajrzyj do sekcji „Przygotowywanie i wysyłanie komunikatów akcji”, która obejmuje – sendAction:to:forEvent:i – addTarget:action:forControlEvents:.


1
 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
       action:@selector(aMethod1:)
forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Show View" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[view addSubview:button];   
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.