2017-12-21 11 views
1

私はやや厄介な問題があります。私のアプリでは、ボタンをプログラムでスワップし、関連するセレクターを適切に呼び出すことができるツールバーがあります。しかし、ナビゲーションバーのボタンに同じテクニックを適用すると、セレクタを呼び出すことができません。次のサンプルコードには、2セットのボタンが含まれています(1つはナビ用&ツールバーのものです)。同じであるにもかかわらず、ナビゲーションバーボタンのセレクタは決して呼び出されません。UIBarButtonItemがツールバーに追加されている間に、ナビゲーションバーにプログラムで追加された呼び出しセレクタに失敗しました

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var toolbar: UIToolbar! 

    let navCancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, 
              target: self, 
              action: #selector(toggleDelete)) 
    let navTrashButton = UIBarButtonItem(barButtonSystemItem: .trash, 
             target: self, 
             action: #selector(toggleDelete)) 

    let toolbarCancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, 
               target: self, 
               action: #selector(toggleDelete)) 
    let toolbarTrashButton = UIBarButtonItem(barButtonSystemItem: .trash, 
              target: self, 
              action: #selector(toggleDelete)) 

    var isDeleting = false { 
     didSet { 
      navigationItem.rightBarButtonItem = isDeleting ? navCancelButton : navTrashButton 
      toolbar.items = isDeleting ? [toolbarCancelButton] : [toolbarTrashButton] 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     isDeleting = false 
    } 

    @objc func toggleDelete() { 
     isDeleting = !isDeleting 
    } 
} 

これは、アクションの前のコードを示しています

enter image description here

+0

を使用しているの下に私の答えをチェック:あなたが行ったようにNAVの項目を初期化する方法がありますターゲットを失うことなく –

答えて

2

ナビゲーションバーのボタンが自分の目標を失うことが表示されます。

self.navTrashButton.target = self 
self.navCancelButton.target = self 

するか、私はどうなるのかは、まさにこのようなクラスのスコープ内の変数を入れている:だから、このようのviewDidLoadで目標を設定することができますいずれかのviewDidLoadで作成し、その後

var navCancelButton: UIBarButtonItem! 
var navTrashButton: UIBarButtonItem! 

し、それらを

navCancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, 
            target: self, 
            action: #selector(toggleDelete)) 
navTrashButton = UIBarButtonItem(barButtonSystemItem: .trash, 
           target: self, 
           action: #selector(toggleDelete)) 

ボタンが作成されていることがわかりました。これは、ビューコントローラがボタンを作成する準備ができていることを期待していることを示しています。

+0

パーフェクト、私はあなたの最初のコメントごとに私のviewDidLoadのターゲットを設定しなければなりません、そして、彼らは今働いています。ありがとうございました! – CodeBender

2

対象が失われている場合、それは「バグ」、可能な回避策かもしれないという事実は、lazy var

lazy var navCancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(toggleDelete)) 
lazy var navTrashButton = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(toggleDelete)) 
+1

この場合、怠け者ヴァルスは完璧にうまくいくはずです。しかし、他の用途ではスレッドセーフではないことに注意してください(ただし、UI要素には問題ありません)。 –

+0

合意した、私は怠惰でもテストし、それは正常に動作しました - ありがとう! – CodeBender

関連する問題