2010-06-15 14 views
56

Dodałem UISegmentedControl w mojej aplikacji. Żaden z przycisków nie jest wybrany w normalnym stanie. Chcę zaimplementować zdarzenie click button po wybraniu pierwszego segmentu i inne zdarzenie po kliknięciu innego przycisku.Zdefiniuj zdarzenie click dla UISegmentedControl

+0

Jak ustawić zwykły segmentu w UISegmented Control. Dzięki. – Pugal

+0

@Pugal devan Ustaw właściwość stylu sterowania segmentami segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered; – Warrior

Odpowiedz

122

Jeśli dobrze rozumiem pytanie, po prostu trzeba zaimplementować metoda docelowa (obsługiwana przez UIControl, która jest klasą nadrzędną UISegmentedControl) dla stałej UIControlEventValueChanged, dokładnie tak, jak w przykładzie podanym w reference documentation użytkownika UISegmentControl.

tj

[segmentedControl addTarget:self 
        action:@selector(action:) 
      forControlEvents:UIControlEventValueChanged]; 

stosowane dla komunikatu o następującym podpis:

- (void)action:(id)sender 

lub

[segmentedControl addTarget:self 
        action:@selector(action:forEvent:) 
      forControlEvents:UIControlEventValueChanged]; 

do

- (void)action:(id)sender forEvent:(UIEvent *)event 

lub

[segmentedControl addTarget:self 
        action:@selector(action) 
      forControlEvents:UIControlEventValueChanged]; 

najprostszego sposobu:

- (void)action 

które stanowią standardowe typy przełączników docelowego działania stosowanych w UIKit.

+5

Po prostu szybkie heads up: Wierzę, że jeśli zdefiniujesz metodę jako - (void), wtedy będziesz chciał, żeby selektor był @selector (akcja), bo inaczej to się zawiesi. –

+1

Selektor musi dokładnie odpowiadać wiadomości, ale bez parametrów, więc @selector (akcja: forEvent :) jest selektorem dla akcji "- (void): (id) sender forEvent: (UIEvent *) event" – Jonathan

+0

Mam pytanie , czy ta czynność zostanie wywołana, nawet jeśli ręcznie zmienię wybrany indeks? Jeśli nie chcę, aby to się stało, czy mogę posłuchać jakiegoś innego zdarzenia kontrolnego? – JohnVanDijk

2

Możesz dołączyć obsługi w IB w przypadku wartości zmieniło: UIControlEventValueChanged

czy można zrobić to w kodzie:

[segmentedControl addTarget:self 
        action:@selector(action:) 
      forControlEvents:UIControlEventValueChanged]; 
9

Spróbuj tego,

UISegmentedControl * travelModeSegment = [[UISegmentedControl alloc] initWithItems: 
    [NSArray arrayWithObjects:NSLocalizedString(@"Driving", nil),     NSLocalizedString(@"Walking", nil), nil]]; 
    [travelModeSegment setFrame:CGRectMake(9.0f, 0.0f, 302.0f, 45.0f)]; 
    [cell addSubview:travelModeSegment]; 
    [travelModeSegment release]; 

następnie napisać skargę,

 if (travelModeSegment.selectedSegmentIndex == 0) { 
     //write here your action when first item selected 
    } else { 
     //write here your action when second item selected 
    } 

Mam nadzieję, że to pomoże Ci

7

Warto zauważyć, że selektor ma dopasować metodę dokładnie, ale bez faktycznych parametrów.

@selector(action) 
    => -(void) action { ..code.. } 

@selector(action:) 
    => -(void) action:(id)sender { ..code.. } 

@selector(action:forEvent:) 
    => -(void) action:(id)sender forEvent:(UIEvent *)event { ..code.. } 

To zdezorientowało mnie najdłużej i nie wynika to jasno z wcześniejszych odpowiedzi.

+1

Dziękuję bardzo za wysiłek włożony w wyjaśnienie, Jonathan. To była jedna z tych rzeczy, które musiałem wyjaśnić dla siebie ... erm ... 'całkiem kiedyś teraz ";-)' Ładnie się prezentował; poszło prosto w mojej bibliotece kodów! :-) – Slowburner

64

spróbuj tego:

- (IBAction)segmentSwitch:(UISegmentedControl *)sender { 
     NSInteger selectedSegment = sender.selectedSegmentIndex; 

     if (selectedSegment == 0) { 

     } 
     else{ 

     } 
    } 
4

Proste tak, trzeba wykonać akcję pomocą storyboard do kontrolera widoku, tak aby ta akcja do pracy.

- (IBAction)searchSegmentedControl:(UISegmentedControl *)sender 
{ 
    switch (sender.selectedSegmentIndex) { 
     case 0: 
      NSLog(@"First was selected"); 
      break; 
     case 1: 
      NSLog(@"Second was selected"); 
      break; 
     case 2: 
      NSLog(@"Third was selected"); 
      break; 
     default: 
      break; 
    } 
} 
6

do szybkiego zastosowania to:

segmentedControl.addTarget(self, action: "segmentSelected:", forControlEvents: UIControlEvents.ValueChanged) 

i wdrożenie metody takie jak to:

func segmentSelected(sender: UISegmentedControl) 
{ 
    println("selected index: \(sender.selectedSegmentIndex)") 
} 

Extend UISegmentedControl jeśli chcesz zadzwonić do konkretnych działań, gdy wybrany jest wybrany Segment:

class CustomSegmentedControl : UISegmentedControl 
{   
    override init() 
    { 
     super.init() 
    } 

    override init(frame:CGRect) 
    { 
     super.init(frame:frame) 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    func valueChanged(index:Int) 
    { 
     // ACTION GOES HERE 
    }  
} 

i nazywają swoją "valueChanged" w "segmentSelected" tak:

func segmentSelected(sender: CustomSegmentedControl) 
{ 
    println("selected index: \(sender.selectedSegmentIndex)") 
    sender.valueChanged(sender.selectedSegmentIndex) 
} 
3

Prosta wersja szybkich aktualizowane

func loadControl(){ 
    self.yourSegmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), forControlEvents: .valueChanged) 
} 

func segmentSelected(sender: UISegmentedControl) 
{ 
    let index = sender.selectedSegmentIndex 

    // Do what you want 
} 
+1

najnowsza szybka składnia: self.segmentedControl.addTarget (self, akcja: #selector (segmentSelected (nadawca :)), dla: .valueChanged) – Gilles

Powiązane problemy