UISegmentedControl не запускается с iOS 5

Кто-нибудь еще видит эту проблему? Я использую сегментированный элемент управления и переопределил его, чтобы, когда пользователь попадает в тот же сегмент (индекс), он не выбирается.

Это нормально работало в предыдущих версиях, но сейчас тестируется на iOS5. И я обнаружил, что UIControlEventValueChanged не отправляется, когда вы нажимаете на тот же сегмент. Таким образом, код работает нормально, когда вы нажимаете на разные сегменты, но не на один и тот же сегмент.

Мой код.

segmentCtrl = [[MySegmentedControl alloc] initWithItems: segmentCtrlLabels];
segmentCtrl.segmentedControlStyle = UISegmentedControlStyleBar;
// Register for touch events
[segmentCtrl addTarget:self action:@selector(segmentedCtrlTouched:) forControlEvents:UIControlEventValueChanged];

Я попытался зарегистрироваться в UIControlEventTouchUpInside и получил такое же поведение.

Есть предложения по работе?

С уважением, Йеньи


person Yenyi    schedule 14.10.2011    source источник
comment
Ага. Аналогичная проблема здесь. В различиях API iOS перечислено несколько изменений в UISegmentedControl, не вдаваясь в подробности. Я также хотел бы узнать, в чем конкретно заключается сделка.   -  person BumbleGee    schedule 15.10.2011


Ответы (2)


Исправлено путем регистрации на событие касания. Если затронутый сегмент такой же, я вручную отправляю событие EventChanged.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{    
NSInteger current = self.selectedSegmentIndex;
[super touchesBegan:touches withEvent:event];

if (current == self.selectedSegmentIndex) {
    [self setSelectedSegmentIndex:current];
    [self sendActionsForControlEvents:UIControlEventValueChanged];
}
}
person Yenyi    schedule 18.10.2011
comment
+1 Я немного изменил это в своем коде, чтобы отменить выбор сегмента напрямую с помощью [self setSelectedSegmentIndex: UISegmentedControlNoSegment]; - person Jason George; 04.11.2011

Ага, вам нужно реализовать управляющие события самостоятельно.

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
    [super touchesBegan: touches withEvent: event];

    [self sendActionsForControlEvents: UIControlEventTouchDown];
}

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
    [super touchesEnded: touches withEvent: event)];

    if (CGRectContainsPoint(self.bounds, [touches.anyObject locationInView: self]))
    {
        [self sendActionsForControlEvents: UIControlEventTouchUpInside];
    }
    else
    {
        [self sendActionsForControlEvents: UIControlEventTouchUpOutside];
    }
}

- (void) touchesCancelled: (NSSet *) touches withEvent: (UIEvent *) event
{
    [super touchesCancelled: touches withEvent: event];

    [self sendActionsForControlEvents: UIControlEventTouchCancel];
}
person Leslie Godwin    schedule 30.01.2013