2010-06-15 3 views
56

В моем приложении я добавил UISegmentedControl. Ни одна из кнопок не выбрана в нормальном состоянии. Я хочу реализовать событие нажатия кнопки, когда выбран первый сегмент, и другое событие, когда нажата другая кнопка.Определить событие click для UISegmentedControl

+0

Как установить обычный сегмент в UISegmented Control. Благодарю. – Pugal

+0

@Pugal devan задает свойство стиля сегмента управления segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered; – Warrior

ответ

122

Если я правильно понимаю ваш вопрос, вы просто должны реализовать target-action (поддерживается UIControl, который является родительским классом UISegmentedControl) для константы UIControlEventValueChanged, точно так же, как в примере, приведенном в UISegmentControl reference documentation.

т.е.

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

используется для сообщения со следующей подписью:

- (void)action:(id)sender 

или

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

для

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

или

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

для самого простого способа:

- (void)action 

которые являются стандартными типами селекторов целевых действий, используемых в UIKit.

+5

Просто быстрый хедз-ап: Я считаю, что если вы определяете действие как -void, то вы хотите, чтобы селектор был @selector (action), иначе он сработает. –

+1

Селектор должен точно соответствовать сообщению, но без параметров, поэтому @selector (действие: forEvent :) является селектором для: - (void) действие: (id) отправитель forEvent: (UIEvent *) событие « – Jonathan

+0

У меня есть вопрос , будет ли это действие вызываться, даже если я изменил выбранный индекс вручную? Если я не хочу, чтобы это произошло, я могу послушать какое-то другое событие управления? – JohnVanDijk

2

Вы можете прикрепить обработчик в IB к событию значения изменено: UIControlEventValueChanged

или вы можете сделать это в коде:

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

Попробуйте это,

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]; 

затем написать действие,

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

Я надеюсь, что это поможет вам

7

Стоит отметить, что селектор должен соответствовать методу точно, но без фактических параметров.

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

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

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

Это смущает меня в течение самого длительного времени, и это не совсем ясно из более ранних ответов.

+1

Огромное спасибо за ваши усилия, Джонатан. Это была одна из тех вещей, которые мне необходимы, чтобы прояснить для себя ... <чудеса, что звучит как разумное признание моим сверстникам> erm ... 'довольно когда-нибудь сейчас' ;-) 'Также представлено красиво; это пропало прямо в моей кодовой библиотеке! :-) – Slowburner

64

попробовать это:

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

     if (selectedSegment == 0) { 

     } 
     else{ 

     } 
    } 
4

Простой, как это, вам нужно сделать действие с помощью раскадровки к контроллеру представления для того, чтобы это действие на работу.

- (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

для СВИФТ использования этого:

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

и реализовать метод, как это:

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

Продлить UISegmentedControl если вы хотите, чтобы вызвать определенное действие, когда выбран выбранный сегмент:

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 
    }  
} 

и позвонить "ValueChanged" в "segmentSelected", как это:

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

Простая версия в стрижа обновленный

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

последний быстрый синтаксис: self.segmentedControl.addTarget (self, action: #selector (segmentSelected (sender :)), для: .valueChanged) – Gilles

Смежные вопросы