LoginSignup
1
1

More than 5 years have passed since last update.

privateなmethodをUIButtonのactionやNSTimerのselectorとして呼ぶ方法

Last updated at Posted at 2015-12-22

エラーが出る書き方

以下のように、private funcで定義されたmethodは呼ぼうとした時クラッシュします

実装例

MyViewController.swift
// 略

override func viewDidLoad() {
    super.viewDidLoad()

    self.button.addTarget(self, action: "buttonAction", forControlEvents: .TouchUpInside)
}

private func buttonAction() {
    print("Hello.")
}

// 略

Errorの内容

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestProject.MyViewController buttonAction]: unrecognized selector sent to instance 0x12f1ca000'

いわゆる「methodが見つかりません」というやつです
もちろんprivateを外すと問題ありません

エラーが出ない書き方

MyViewController.swift
// 略

dynamic private func buttonAction() {
    print("Hello.")
}

// もしくは

@objc private func buttonAction() {
    print("Hello.")
}

// 略

個人的にはSwiftコードの中に突然@が出てくるのが嫌なのでdynamic修飾子を付けています
@objcを付けるという意味では、自動で@objcがつくタイプのもの(@IBOutlet, @IBAction, or @NSManaged)を使っても一応解決できると思います

@objcdynamicの違いや、エラーが出なくなる細かい理由については、objc_msgSendがどーのこーのということになるのですが、詳しくはAppleのドキュメントを参照してください

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1