2017-12-21 33 views
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

내 대답을 확인 사용하는 "버그"가 될 수 있습니다 탐색 항목 당신이 그랬던 것처럼 init을 할 수있는 방법이 목표를 잃지 않고 –

답변

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

그래,이 경우 게으른 vars 완벽하게 잘 작동합니다. UI 엘리먼트에 대한 문제가 아니라 다른 사용법을 위해 쓰레드가 안전하지 않다는 것에 조심하십시오. –

+0

동의 함, 나는 게으름 뱅이로 테스트를했는데 제대로 작동했다. 감사합니다! – CodeBender