2017-04-08 11 views
1

내가 인수로 UIBarButtonItem, 를 전달하기 위해 노력하고있어와 방법에 인수를 전달하는 그러나 나는 다음과 같은 오류 얻을 : 어떻게 '#selector'

@objc func barClicked(sender: AnyObject) { 

} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    let bar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 50)) 
    bar.barStyle = UIBarStyle.default 
    bar.items = [ 
     UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), 
     UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(barClicked(sender: bar.items[0])))] 
    bar.sizeToFit() 
} 

Argument of '#selector' does not refer to an '@objc' method, property, or initializer

는 또한 #selector(barClicked(sender: bar.items[0] as AnyObject

감사합니다 노력을

+3

는 "관련"섹션에서 참조하시기 바랍니다, 이것은 반복적으로 묻고 답했습니다. 선택기에서 인수를 전달할 수 없습니다. –

+1

FYI - 단추가 인수가됩니다. 직접 지정하지 않아도됩니다. – rmaddy

+0

@ Martin 감사합니다. 해결할 대안이 있습니까? –

답변

2

절대 를 사용할 때 참조하는 메소드에 인수를 전달하십시오.리터럴 인수는 셀렉터의 수행자가 메서드에 전달합니다.이 경우에는 UIBarButtonItem의 내부 동작입니다.

선택기 수행
#selector(barClicked) 

sender 매개 변수는이 설정되어 있기 때문에, 도구 모음에서 두 번째 UIBarButtonItem에 대한 참조를 개최 가능성이 가장 높은 것입니다

이 문제를 해결하려면 인수 목록을 제거 두 번째 UIBarButtonItem의 경우 action으로 선택합니다.

그러나 보낸 사람이 의도적으로 보낸 사람을 도구 모음의 첫 번째 UIBarButtonItem으로 지정하려는 것 같습니다. 이것은 꽤 반 직관적 인 것처럼 들립니다. 여기서 뭔가 잘못하고있을 수도 있습니다. 하지만이 도구 모음의 첫 번째 항목을 통과 주장하는 경우, 다음을 수행하십시오

// add a new method like this: 
func someMethod() { // name this properly! 
    barClicked(sender: bar.items[0]) // please make bar a class-level variable first. 
} 

이 그럼 당신은 #selectorsomeMethod를 참조 할 수 있습니다 :

#selector(someMethod)