Обнаружение события при нажатии на уже выбранный сегмент

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

я реализовал решение ниже

import UIKit

class MARSSegmentController: UISegmentedControl {

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
    // Drawing code
    }
    */

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        let oldValue:NSInteger = self.selectedSegmentIndex
        super.touchesBegan(touches, withEvent: event)
        if oldValue == self.selectedSegmentIndex{
            sendActionsForControlEvents(UIControlEvents.ValueChanged)
        }
    }    
} 

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

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

Если какое-либо решение, пожалуйста, предложите.

3 ответа

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

Решение выше было близко, но вот что сработало для меня. Захватите существующий, выбранный индекс сегмента на touchesBegan, а затем в touchesEnded сравните старое значение с текущим выбранным индексом сегмента. Если они совпадают, я вручную запускаю событие.ValueChanged. Примечание: это синтаксис Swift 2.0.

class SegmentedControlExistingSegmentTapped : UISegmentedControl
{
    // captures existing selected segment on touchesBegan
    var oldValue : Int!

    override func touchesBegan( touches: Set<UITouch>, withEvent event: UIEvent? )
    {
        self.oldValue = self.selectedSegmentIndex
        super.touchesBegan( touches , withEvent: event )
    }

    // This was the key to make it work as expected
    override func touchesEnded( touches: Set<UITouch>, withEvent event: UIEvent? )
    {
        super.touchesEnded( touches , withEvent: event )

        if self.oldValue == self.selectedSegmentIndex
        {
            sendActionsForControlEvents( .ValueChanged )
        }
    }
}

Только положилself.nameSegmentedControl.isMomentary = true

Когда ваш метод связан с valueChanges, обнаруживается касание.

Я думаю, что ваша проблема заключается в том, что if oldValue == self.selectedSegmentIndex всегда будет возвращать истину из-за let oldValue:NSInteger = self.selectedSegmentIndex, Так что все, что вам нужно, это изменить ваше условие if if oldValue == selectedValue где selectedValue - это значение, с которым вы считаете выбранный сегмент

Другие вопросы по тегам