2017-10-01 8 views
1

을 닫거나 취소하려면 #selector의 하위 클래스 UIBarButtonItem을 사용하는 작은 라이브러리 McPicker이 있습니다. 이것은 Swift 4와 Xcode 9까지 잘 돌아갔다. 내가 무엇을해도 상관없이 cancel 셀렉터는 done UIBarButtonItem #selector에서도 호출된다.스위프트 4는 일관되게 잘못된 #selector를 호출합니다.

저는 왜 단 하나의 선택기가 불려지는지 전혀 아이디어가 없습니다. 심지어 모든 버튼을 만들기 위해 해킹을 해본 적이 있더라도 done 함수를 호출하면 cancel이 여전히 호출됩니다.

내 UIBarButtonItems은과 같이 McPickerBarButtonItem.swiftclass functions에 의해 초기화하기됩니다

self.init(barButtonSystemItem: barButtonSystemItem, target: mcPicker, action: #selector(McPicker.done)) 

McPicker.swift에 아래의 호출 :

@objc internal func done() { 
    self.doneHandler(self.pickerSelection) 
    self.dismissViews() 
} 

@objc internal func cancel() { 
    self.cancelHandler() 
    self.dismissViews() 
} 

다시 말하지만, 나는 #selector(McPicker.done) 또는 #selector(McPicker.cancel)을 설정하면 #selector(McPicker.cancel) 이제까지라고 . 나는 이것이 왜 어떤 제안이 대단히 감사 하리라는 생각이 들었는지에 대한 아이디어가 없다. 감사!

+0

에 대한 문제의보기이었다 않는 한 탭을 무시하고 다음을 추가했다 'Selector ("done")'을 사용하여'#selector (McPicker.done) '? –

+0

@KevinBallard, 시도해 보았습니다. 같은 문제, 여전히'func cancel()'을 호출합니다. 나를 미치게 만들어! – kev

+0

클릭했을 때 버튼의'action'속성을 기록하면 어떻게됩니까? 아마도 펜촉은 사실 이후에 그것을 바꿀 것입니다. –

답변

0

이것은 결국 #selector과 관련이 없습니다. 실제로는 UITapGestureRecognizer에 의해 발생했습니다. 내 견해를 무시하기 위해 탭 제스처를 사용하고있었습니다. 나는 UIToolBar, PickerUIBarButtonItem을 하위보기로 사용했습니다. 문제는 모든 터치가 cancel으로 하이재킹되었다는 것입니다.

나는 엑스 코드 (8), 스위프트 3 & 아이폰 OS 10에서 멀리이와 가지고 있지만, 당신은 대체하면 어떻게됩니까 아이폰 OS (11)

extension McPicker : UIGestureRecognizerDelegate { 

    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 
     if let goodView = touch.view { 
      return goodView == self 
     } 
     return false 
    } 
}