20396


こんにちは、一日中ハマっていたので質問させて下さい・・！

TableViewに返すCustomViewCellを作成しています。

**・やりたいこと**  
大本のTableViewから、各xibファイルをレンダリングし、  
そこでのデータを取ってきた後、それを元に処理するというのを実装しようとしたところ、  
躓いてしまいました。

**・状況**  
nibファイルを複数作成しており、そのTableViewのrowに応じて nibファイルをレンダリングしようとしております。  
nibファイルには、cellにTextFieldクラスの物や、 UIPickerViewクラスのもの、 ボタンしかないものの３種類です。

以下のUITableViewCellを継承したCustomAddTrainingクラスは、複数のnibファイルに使用できるように、一つのファイルにまとめてあります。  
もちろん各nibファイルにはこのCustomAddTrainingに設定してあります。  
それが以下のソースです。

**・問題点**  
現在の問題は、  
myPicker :UIPickerView!と decideButton: UIButton!がnilと判定されることです。  
UITextField!はnilではなく、問題なく動いているのですが、この２つがどうしてもnilとなってしまいます。

（当たり前ですが）ファイルを１つにまとめずに作れば問題なく動くのですが、  
UITableViewCellを継承した一つのファイルにまとめると、宣言下のにも関わらず認識されません。

なぜなんでしょうか？ご教授願います！

[code]

    import UIKit
    
    class CustomAddTraining: UITableViewCell, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate {
    
    let category = ["Front", "Back", "Abnominal", "Leg", "Hip"]
    
    @IBOutlet weak var done: UIButton!
    @IBOutlet weak var decideButton: UIButton!
    @IBOutlet weak var myTextField: UITextField!
    
    @IBOutlet weak var myPicker: UIPickerView!
    
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
    
        if myTextField != nil {
            myTextField.delegate = self
            myTextField.borderStyle = .RoundedRect
        }
    
        if myPicker.delegate != nil {
            myPicker.delegate = self
        }
        if myPicker.dataSource  != nil {
            myPicker.dataSource = self
        }
    
        decideButton?.hidden = true
    }
    
    
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    
    }
    
    func textFieldDidBeginEditing(textField: UITextField) {
        decideButton.hidden = false
    }
    
    @IBAction func decideAction(sender: AnyObject) {
        textFieldShouldReturn(myTextField)
    }
    
    func textFieldShouldEndEditing(textField: UITextField) -> Bool {
        decideButton.hidden = true
        return true
    }
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        myTextField.resignFirstResponder()
        return true
    }
    
    //pickerに表示する列数を返すデータ・ソースメソッド
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{
        return 1
    }
    
    //行数を返す
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        return category.count
    
    }
    //表示するデータを返す
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return category[row]
    }
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print(category[row])
    }
    
    
    } 
    
[/code]


CC BY-SA 3.0
2015-12-25T12:06:50.780
20372
2015-12-26T08:55:09.887
2015-12-25T12:21:40.347
7362
5828
question
ios swift
複数のxibファイルを一括で管理するカスタムクラスを作成したが、、


> nibファイルを複数作成しており、そのTableViewのrowに応じて nibファイルをレンダリングしようとしております。  
>  nibファイルには、cellにTextFieldクラスの物や、 UIPickerViewクラスのもの、 ボタンしかないものの３種類です。
>
>
> 以下のUITableViewCellを継承したCustomAddTrainingクラスは、複数のnibファイルに使用できるように、一つのファイルにまとめてあります。

この場合、nib ファイルによっては「接続していない outlet 」があると思うのですが、`CustomAddTraining`
クラスがインスタンス化されたとき、それらはそのまま `nil` になります。

ですので、コード中で接続されていない可能性のある outlet にアクセスするときは、`nil` である場合を想定しておく必要があります。

あとは通常 Swift でオプショナルな値を扱う方法で書き直せばいいのですが、この場合は outlet の型が
`ImplicitlyUnwrappedOptional` になっているのがそもそも実状に合っていないので、`Optional`
に変更してしまうのがいいのではないかなと思います：

[code]

    @IBOutlet weak var done: UIButton?
    @IBOutlet weak var decideButton: UIButton?
    @IBOutlet weak var myTextField: UITextField?
    
    @IBOutlet weak var myPicker: UIPickerView?
    
[/code]

変更すると、コンパイラが修正の必要な箇所を指摘してくれると思います。


CC BY-SA 3.0
2015-12-26T07:03:10.693
20396
2015-12-26T08:55:09.887
2015-12-26T08:55:09.887
2299
2299
20372
answer