9

ビューに 2 つの異なる UIPickerView があります。ストーリーボードを介してホストされているビューに dataSource とデリゲートを設定するとうまく機能しますが、以下で説明するようにコードを介してそれを実行しようとすると、機能しません。

両方のピッカーは、表示するデータが異なります (デリゲートの動作も異なる可能性があります)。したがって、それらをプログラムでさまざまなデータ ソースに接続したいと考えています。

UIPickerViewDataSource および UIPickerViewDelegate-Protocols を実装し、そのクラスのオブジェクトを PickerViews に接続する独自のクラスを作成しようとしましたが、機能しません。これを示す例外が実行時にスローされますterminating with uncaught exception of type NSException

2015-01-09 17:50:05.333 Pet Stats[4953:244338] -[NSConcreteMapTable numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7b4616d0
2015-01-09 17:50:05.338 Pet Stats[4953:244338] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMapTable numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7b4616d0'

どうすればこれを機能させることができますか? 私は何を取りこぼしたか?これが私のコードです:

WeightWheelController.swift

import UIKit

class WeightWheelController: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
    let ElementCount: Int!

    init(pickerInterval: Int) {
        ElementCount = pickerInterval
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return ElementCount
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        return String(row + 1)
    }

    func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)
    {
        println("External Controller:" + String(row + 1))
    }
}

WeightWheelInputViewController.swift

import UIKit

class WeightWheelInputViewController: UIViewController {
    @IBOutlet weak var picker1: UIPickerView!        
    @IBOutlet weak var picker2: UIPickerView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //picker attached to c1 should show number from 1 to 150
        let c1 = WeightWheelController(pickerInterval: 150)

        //picker attached to c1 should show number from 1 to 10
        let c2 = WeightWheelController(pickerInterval: 10)

        picker1.dataSource = c1
        picker1.delegate = c1

        picker2.dataSource = c2
        picker2.delegate = c2
    }

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

簡単な更新:

この質問では、さまざまなピッカー ビューにさまざまなタグを使用できることがわかりました。それは 1 つのオプションです。それでも、私はそれが好きではありません。私はむしろMVCのようなアプローチに従い、異なるコントローラーを各ピッカーに接続したいと考えています。それはどんな方法でも可能ではありませんか?

4

1 に答える 1