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

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

    } 

동작이 click 이벤트에 응답 할 수 없습니다. 나는 breakpoint를 추가하여 함수에 들어 가지 않았 음을 발견했다. 내 코드가 무엇이 잘못되었는지 전혀 모른다. 모든 답변을 주시면 감사하겠습니다. 미리 감사드립니다.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

viewDidLoad 함수에서 UIBarButtonItem 초기화를 수행하면 액션이 응답 할 수 없습니다. 그러나 내가 그것을 기능에 넣었을 때. 그것은 작동합니다. 나는 이유를 모른다. 그러나 문제는 해결되었습니다. 이유를 알면. 말해줘. 고맙습니다.

+2

클래스 밖에서 함수 밖에서는 명시 적으로 그리고 암시 적으로'self'를 참조하기 때문에 초기화되지 않습니다. 나는 컴파일러가 다른 상황에서와 같은 상황에서 경고하지 않는 버그라고 생각한다. 그러나,'lazy'라고 선언하면 속성이 액세스 될 때까지'self'가 완전히 형성됩니다 (위의 느슨한 예제 참조). –

관련 문제