2016-10-29 10 views
0

チュートリアル(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 
} 

ご協力いただければ幸いです。

答えて

0

移動はあなたのボタンのターゲットに設定する前にこれらの行:nil

+0

今あなたがターゲットとしてself.viewModelを追加している

let viewModel = GreetingViewModel(person: model) self.viewModel = viewModel 

を、しかしself.viewModelがあるが、私はまた、(モデル=人を聞かせて '移動しなければなりませんでしたfirstName: "David"、lastName: "Blaine") 'これらの2つの行では動作しましたが!ありがとう! – Jim

+0

@Vinodh、@ beyoulfの答えは、重要なのは 'showGreetingButton.addTarget(self.viewModel、action:#selector(GreetingViewModel.showGreeting))の前にあることが明らかになったので、 .touchUpInside) '。あなたの編集はあまり明確ではありません。 – Jim

+0

古いものを置き換えます – Vinodh

関連する問題