2017-01-02 6 views
0

こんにちは、この質問は好奇心のためです。iOS UIPickerViewがnumberOfRowsInComponentを呼び出してもUIPickerViewDataSourceがバインドされていない

私のコントローラにはUIPickerViewがあり、デリゲートはIBからバインドされ、コントローラに実装されており、UIPickerViewDataSourceメソッドの1つはコントローラnumberOfRowsInComponentに実装されています。このメソッドは、even dataSourceと呼ばれ、完全に実装されて実装されていません。私はそれがどのように可能なのだろうか?私の考えの1つは、暗黙のうちにバックグラウンドから呼び出されたこのメソッドです。あなたが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

よろしいですか、私はストーリーボードからデリゲートを設定しましたが、コードやストーリーボードではデータソースを設定しませんでした。 numberOfRowsInComponentメソッドはdataSourceメソッドなので、私の質問は、このメソッドがdataSourceで何もしなかったということです。 – Eren

+0

複数のpickerViewsがありますか?デリゲートとデータソースをすでに設定しているビューを貼り付けてコピーしていないかどうかを確認してください。 –

+0

いいえ、私はpickerviewが1つしかありません – Eren

0

これは素晴らしいことですが、それを機能と呼んでみましょう。 Obj-Cの背景があまりないので、どうやってこれが起こるのか分かりません。

私はまた、一部のビューではデリゲートのみを持ち、dataSourceメソッドは呼び出されますが、ピッカーのデータソースは実行時にnilですが、UIPickerViewもあります。私が変更するときスウィフト3 @objc推論をデフォルトに設定するか、ビルド設定からノーとすれば、メソッドは正しく呼び出されません。dataSourceはnilであり、空のピッカーがあります。これがXcodeに追加されたのはわかりませんが、明らかにSwift3が出た後です。

Obj-C実装の内部ロジックには、デリゲートのみが設定されていても何らかの理由でdataSourceメソッドが何らかの理由で呼び出されると考えられます。もし誰かが知っていると、これがなぜ起こるか知ることは面白いでしょう。

関連する問題