我正在尝试通过学习教程(link)来了解MVVM模式,但是我无法执行已添加到UIButton的操作(我使用的是Swift 3.0)。我已经尝试调试了几个小时,研究了该线程(@selector in swift)和其他线程,但仍然遇到问题。当我单击按钮时,什么也没有发生。我用选择器尝试了各种语法选项,我认为您在下面看到的是正确的。我认为我正在使用的协议可能是导致此问题的原因,但是由于我对协议的经验有限,因此我可能完全错了。
我将所有代码放在这里,以防有人想要将其放入Xcode。这里涉及的操作是在我添加到UIViewController
的showGreetingButton
中:
class GreetingViewController : UIViewController {
let showGreetingButton = UIButton()
@IBOutlet weak var greetingLabel: UILabel!
var viewModel: GreetingViewModelProtocol! {
didSet {
self.viewModel.greetingDidChange = { [unowned self] viewModel in
self.greetingLabel.text = viewModel.greeting
}
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
showGreetingButton.backgroundColor = UIColor.red
showGreetingButton.tintColor = UIColor.black
showGreetingButton.setTitle("Show Greeting", for: .normal)
// I add the action here:
showGreetingButton.addTarget(self.viewModel, action: #selector(GreetingViewModel.showGreeting), for: .touchUpInside)
showGreetingButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(showGreetingButton)
let buttonTop = NSLayoutConstraint(item: showGreetingButton, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.greaterThanOrEqual, toItem: view, attribute: NSLayoutAttribute.topMargin, multiplier: 1.0, constant: 20)
let buttonLeading = NSLayoutConstraint(item: showGreetingButton, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.leadingMargin, multiplier: 1.0, constant: 0.0)
showGreetingButton.contentEdgeInsets = UIEdgeInsetsMake(2, 2, 2, 2)
NSLayoutConstraint.activate([buttonTop, buttonLeading])
let model = Person(firstName: "David", lastName: "Blaine")
let viewModel = GreetingViewModel(person: model)
self.viewModel = viewModel
}
}
我的视图模型称为GreetingViewModel,它采用了一种协议:
protocol GreetingViewModelProtocol: class {
var greeting: String? { get }
var greetingDidChange: ((GreetingViewModelProtocol) -> ())? { get set }
init(person: Person)
func showGreeting()
}
class GreetingViewModel : GreetingViewModelProtocol {
let person: Person
var greeting: String? {
didSet {
self.greetingDidChange?(self)
}
}
var greetingDidChange: ((GreetingViewModelProtocol) -> ())?
required init(person: Person) {
self.person = person
}
@objc func showGreeting() {
self.greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName
}
}
我的简单模型是:
struct Person {
let firstName: String
let lastName: String
}
任何帮助将是非常,非常感谢。
最佳答案
在设置按钮目标之前,将这些行移动到:
let viewModel = GreetingViewModel(person: model)
self.viewModel = viewModel
现在,您要添加
self.viewModel
作为目标,但self.viewModel
是nil
关于ios - 对UIButton的操作不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40314907/