2016-07-20 6 views
1

Я пытаюсь создать UISwitch программно (нет IBOutlets или IBActions), и я не могу понять, как заставить переключатель изменять состояния при нажатии. Я думал, что ...Swift - UISwitch не обновляется при переключении On/Off

mySwitch.addTarget() 

... назвали бы каждый раз, когда переключатель был переключен On/Off, но это, кажется, не так. Может кто-нибудь объяснить, что я делаю неправильно и как исправить это.

import UIKit 
import XCPlayground 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 568 * 0.75)) 

view.backgroundColor = UIColor.whiteColor() 
view.layer.borderColor = UIColor.grayColor().CGColor 
view.layer.borderWidth = 1 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 50)) 

label.text = "Label" 
label.textAlignment = NSTextAlignment.Center 

view.addSubview(label) 

func switchChanged(sender: UISwitch!) { 
    if sender.on == true { 
     label.text = "Switch is ON" 
    } else if sender.on == false { 
     label.text = "Switch is OFF" 
    } 
} 

let mySwitch = UISwitch() 

mySwitch.center = view.center 
mySwitch.setOn(true, animated: false) 
mySwitch.onTintColor = UIColor.redColor() 
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

view.addSubview(mySwitch) 

XCPlaygroundPage.currentPage.liveView = view 

ответ

0
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

Но это не ярлык, который содержит функцию switchChanged: это вам.

У вас будет гораздо лучшая удача, правильно настроив это в реальном проекте приложения (т. Е. Не на игровой площадке). У вас будет контроллер вида, который может действовать как self и может быть целью.

+1

Не пытайтесь играть с таким серьезным взаимодействием на детской площадке. Это как поцелуй лягушки: ничего не происходит, и это раздражает лягушку. – matt

1

Вам нужны некоторые исправления для этой линии:

mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

Чтобы addTarget работать, вам нужен экземпляр, который реагирует на действия. Очевидно, label не ответил бы на switchChanged.

Заключите ваш метод действия в классе:

class MyTarget { 
    @objc func switchChanged(sender: UISwitch!) { 
     if sender.on == true { 
      label.text = "Switch is ON" 
     } else if sender.on == false { 
      label.text = "Switch is OFF" 
     } 
    } 
} 

Другой проблемой является использование Selector.init, если вы пишете Selector(switchChanged(mySwitch)), Swift выполняет аргумент switchChanged(mySwitch), а затем передает результат Selector.init. В то время как тип возврата switchChanged равен Void, ваш код почти совпадает с кодом Selector().

Попробуйте использовать #selector Обозначения насколько возможно. В этом случае, с введенным выше классом, вы можете записать его как #selector(MyTarget.switchChanged).

Таким образом, чтобы addTarget должным образом, вам необходимо изменить строку, как:

let target = MyTarget() 
mySwitch.addTarget(target, action: #selector(MyTarget.switchChanged), forControlEvents: .ValueChanged) 

Мой Xcode является своего рода упрямая, и мне нужно, чтобы перезапустить Xcode, чтобы увидеть LiveView график, но, с этими изменениями, я верьте, что ваш код работает так, как ожидалось.

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

  • Нет связанных вопросов^_^