2016-11-03 17 views
3
let leftbarbuttonitem = UIBarButtonItem(title:"Reset",style: .plain, target: self, action: #selector(tapResetButton(_:))) 

    func tapResetButton(_ sender:UIBarButtonItem){ 
     count = 0 
     numberLabel.text = "0" 

    } 

アクションがクリックイベントに応答できません。ブレークポイントを追加して、それが関数に入っていないことがわかった。私は自分のコードに何が間違っているのか分かりません。どんな答えも高く評価されます。前もって感謝します。swift 3.0 UIBarButtonItemアクションが機能しない

+0

あなたは 'のviewDidLoad()'メソッド内で 'UIBarButton'項目を宣言することができます。あなたのアクチンのメソッドが呼び出される必要があります。あなたの欠けているものかもしれません。 –

+1

@Ashokあなたの答えをありがとう。宣言UIBarButtonItemをviewDidLoad()の中に置くと動作します。しかし、なぜ宣言をviewDidLoad()の外側に置くことができないのですか? – littlebear333

答えて

6

スイフト3.0

のviewDidLoad()内部UIBarButtonを宣言

override func viewDidLoad() { 
    super.viewDidLoad() 
    let logout: UIBarButtonItem = UIBarButtonItem.init(title: "Logout", style: .plain, target: self, action: #selector(ViewController.logOut)) 
} 

func logOut() { 
    print("LogOut") 
} 

のviewDidLoad()外部UIBarButtonItemを宣言viewDidLoad完全に外側に
var logout:UIBarButtonItem = UIBarButtonItem() 

override func viewDidLoad() { 
     super.viewDidLoad() 
     logout = UIBarButtonItem.init(title: "Logout", style: .plain, target: self, action: #selector(ViewController.logOut)) 
} 

func logOut() { 
     print("LogOut") 
} 

宣言は()

lazy var logout: UIBarButtonItem = { 
    UIBarButtonItem.init(title: "Logout", style: .plain, target: self, action: #selector(ViewController.logOut)) 
}() 

いずれかが動作するはずです。あなたのアクションのパラメータについては

どちらかあなたはViewController名を明示的に指定することができますまたはあなただけのselfを言うことができます。

action: #selector(self.logOut) 
1

UBarButtonItemの初期化をviewDidLoad関数から外しても、アクションは応答できません。しかし、私はそれを関数に入れました。できます。どうしてか分かりません。しかし、問題は解決されています。あなたが理由を知っていれば。教えてください。ありがとうございました。

+2

クラスの本体の外にある関数の外では、明示的かつ暗黙的に 'self'を参照しているため、初期化されません。私はそれが他の場合と同様に、コンパイラが警告しないバグだと思う。しかし、 'lazy'として宣言すれば、プロパティがアクセスされるまでに' self'が完全に形成されるので、動作します(上記の遅延的な例を参照してください)。 –

関連する問題