チュートリアル(link)とから学習することで、MVVMパターンを理解しようとしています。UIButtonに追加したアクションを取得できません。 Swift 3.0を使用して)。私は数時間デバッグしようとしましたが、このスレッド(@selector in swift)と他のものを研究しましたが、まだ固執しています。ボタンをクリックすると、何も起こりません。私はセレクタでさまざまな構文オプションを試してみました。私は使用しているプロトコルが問題に寄与しているかもしれないと思っていますが、プロトコルに関する私の経験が限られているので、私はそれについて完全に間違っている可能性があります。UIButtonのアクションが機能しない
誰かがXcodeにドロップしたい場合は、ここにすべてのコードを入れておきます。問題のアクションは、ここで私はshowGreetingButton
に追加するというのが私のUIViewController
である:プロトコルを採用GreetingViewModelと呼ばれる
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
}
}
マイビューモデル:
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
}
ご協力いただければ幸いです。
今あなたがターゲットとして
self.viewModel
を追加しているを、しかし
self.viewModel
があるが、私はまた、(モデル=人を聞かせて '移動しなければなりませんでしたfirstName: "David"、lastName: "Blaine") 'これらの2つの行では動作しましたが!ありがとう! – Jim@Vinodh、@ beyoulfの答えは、重要なのは 'showGreetingButton.addTarget(self.viewModel、action:#selector(GreetingViewModel.showGreeting))の前にあることが明らかになったので、 .touchUpInside) '。あなたの編集はあまり明確ではありません。 – Jim
古いものを置き換えます – Vinodh