2017-01-02 3 views
0

안녕하세요.이 질문은 호기심에 관한 것입니다.iOS UIPickerView는 numberOfRowsInComponent를 호출합니다. UIPickerViewDataSource가 바인딩되어 있지 않습니다.

내 컨트롤러에 UIPickerView가 있고 대리자가 IB에서 바인딩되어 컨트롤러에 구현되어 있으며 UIPickerViewDataSource 메서드 중 하나가 numberOfRowsInComponent 컨트롤러에 구현되어 있습니다. 이 메소드는 심지어 dataSource가 바인드되지 않고 완전히 구현된다는 것을 호출합니다. 어떻게 가능할까요? 내 생각 중 하나는 백그라운드에서 암묵적으로 호출 된이 메서드는 ... 내 코드; 당신은 당신이 storyboard에서 delegate/datasource 설정 한 귀하의 의견, pickerView.delegate = self/pickerView.datasource = self에 다음 동등한에서 언급했듯이

class ViewController: UIViewController, UIPickerViewDelegate { 

let titles = ["item 1", "item 2", "item 3", "item 4", "item 5"] 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return titles.count 
} 

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return titles[row] 
} 
+0

스토리 보드에서 선택기보기 용 대리자를 설정 했습니까 ?? –

+0

예, 내 인터페이스 빌더에서이 코드는 btw를 작동합니다. 제 질문은 numberOfRowsInComponent가 구현되지 않은 프로토콜을 호출하는 방법입니다. – Eren

답변

0

.

당신은 에 의해 delegatedatasource 하나가 코딩 또는 스토리 보드에서 할당 할 수 있습니다. 따라서 귀하의 경우에는 storyboard에서 완료 했으므로 실제적으로 귀하의 pickerView과 연결됩니다.

+0

좋아, 스토리 보드에서 위임을 설정했지만 코드 또는 스토리 보드로 dataSource를 설정하지 않았습니다. numberOfRowsInComponent 메서드는 dataSource 메서드이므로 내 질문은 심지어이 메서드는 심지어 내가 dataSource와 아무 것도하지 않았다는 것입니다. – Eren

+0

하나 이상의 pickerViews가 있습니까 ?? 위임자와 데이터 소스를 이미 설정 한보기를 붙여 넣은 사본을 복사하지 않았는지 확인하십시오. –

+0

아니요 하나의 선택기 만 있습니다. – Eren

0

이것은 놀랍습니다. 기능을 호출하겠습니다. obj-C 배경이별로 없기 때문에 어떻게 그리고 왜 이런 일이 일어날 지 모릅니다.

또한 일부보기에서는 UIPickerView가 있는데, 위임자는 하나만 설정되어 있고 데이터 소스는 런타임시 선택기의 데이터 소스가 없어도 호출됩니다. 내가 바꿀 때 Swift 3 @objc 유추을 기본값으로 설정하거나 빌드 설정에서 no로 설정하면 dataSource가 nil이고 빈 선택기가있는 것처럼 메서드가 올바르게 호출되지 않습니다. 이것이 Xcode에 언제 추가되었는지는 모르겠지만 Swift3이 나온 후에는 분명히 알 수 있습니다.

그래서 Obj-C 구현의 내부 논리는 대리자 만 설정된 경우에도 어떻게 든 dataSource 메서드를 호출한다고 생각합니다. 누군가가 왜 이런 일이 일어날지를 아는 것이 더 재미있을 거라는 것을 안다면.