23864


いつもお世話になっております。  
当方初心者です。  
表題の件の通りです。

現在アプリをRealmSwiftを使って作っています。

別のViewでチーム名と選手名を新規登録をします。  
それを下記のVeiwのUITextFieldをタップした際、既に登録済みのチーム・選手がUIPickerVeiwで出てきて、そのチーム・選手を選択して修正し更新ができるようにしたいです。

取り敢えず自分の分かる範囲で下記のコードを書きましたが、

[code]

    token = realm.addNotificationBlock { [weak self] (notification, realm) -> Void in　self?.pickerView.reloadAllComponents()
    
[/code]

の部分で、  
Ambiguous reference to member 'pickerview(_:titleForRow:forConponet:)'  
とエラーが立ちます。

文法的に誤っているようですが、何がどう誤っているのか？がわかりません。

どなたか解る方がいらっしゃいましたら、ご教授下さい。  
お願いします。

import UIKit  
import RealmSwift

[code]

    class ViewController3: UIViewController,UIPickerViewDelegate,UIToolbarDelegate, UITextFieldDelegate{
    
        @IBOutlet weak var textField: UITextField!
        @IBOutlet weak var textField2: UITextField!
        @IBOutlet weak var teamLabel: UILabel!
        @IBOutlet weak var nameLabel: UILabel!
    
        var team:String!
        var name:String!
        var team1:String!
        var name1:String!
    
        var user: Results<User>?
        var token: NotificationToken?
    
        //変数指定↓
        var toolBar: UIToolbar!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let realm = try! Realm()
            let user = realm.objects(User)[0]
    
                team1 = user.team
                teamLabel.text = team1
                name1 = user.name
                nameLabel.text = name1
    
            //pickerview↓
            let pickerView = UIPickerView()
            pickerView.showsSelectionIndicator = true
            pickerView.delegate = self
    
            textField.inputView = pickerView
    
            toolBar = UIToolbar(frame: CGRectMake(0, self.view.frame.size.height/6, self.view.frame.size.width, 40.0))
            toolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)
            toolBar.barStyle = .BlackTranslucent
            toolBar.tintColor = UIColor.whiteColor()
            toolBar.backgroundColor = UIColor.blackColor()
    
            let toolBarBtn = UIBarButtonItem(title: "    完了    ", style: .Done, target: self, action: #selector(ViewController3.tappedToolBarBtn(_:)))
            toolBarBtn.tag = 1
            toolBar.items = [toolBarBtn]
            textField.inputAccessoryView = toolBar
    
            token = realm.addNotificationBlock { [weak self] (notification, realm) -> Void in
                self?.pickerView.reloadAllComponents()
            }
        }
    
        @IBAction func textFieldDidEndOnExit(sender: UITextField) {
    
            let realm = try! Realm()
            let user = User()
            try! realm.write {
    
                team = textField.text
                user.team = team
                name = textField2.text
                user.name = name
            }
        }
        //キーボードを閉じる
        func textFieldShouldReturn(textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            return true
        }
        //pickerに表示する列数を返す
        func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int {
            return 1
        }
        //pickerに表示する値を返すデリゲートメソッド
        func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> Int? {
            if let user = user {
                return user.count
            }
            return 0
        }
        //pickerが選択された際に呼ばれるデリゲートメソッド
        func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            if let user = user {
                return user[row].name
            }
            return nil
        }
        func tappedToolBarBtn(sender: UIBarButtonItem) {
            textField.resignFirstResponder()
        }
    }
    
[/code]


CC BY-SA 3.0
2016-04-08T22:00:41.370
23862
2016-04-09T01:32:05.877
13156
question
ios swift xcode
RealmSwiftのデータをUITextField内のUIPickerViewで参照修正したい。


_文法的に誤っているようですが、何がどう誤っているのか？がわかりません。_  
まずは、結論を一般的に言うと  
**インスタンスプロパティとローカル変数の区別・使いわけができていないので正しく出来るようにしてください** と言うことになります。  
この辺が自分でわかるようにならないと、サンプルコードのつぎはぎ以上のものは作れません。プログラミング言語の文法的な面もしっかり学習するようにしてください。

あなたのコードのこの行:

[code]

                self?.pickerView.reloadAllComponents()
    
[/code]

これは、

  * `self`で表される(Optionalな)インスタンス(この場合`ViewController3`型のインスタンス)の
  * インスタンスプロパティ`pickerView`(あなたのコードには存在しない)の
  * `reloadAllComponents()`メソッドを呼ぶ

というコードです。  
ところがあなたの`ViewController3`クラスの構造は次のようになっています。

[code]

    ViewController3
        textField (インスタンスプロパティ)
        textField2 (インスタンスプロパティ)
        teamLabel (インスタンスプロパティ)
        nameLabel (インスタンスプロパティ)
        team (インスタンスプロパティ)
        name (インスタンスプロパティ)
        team1 (インスタンスプロパティ)
        name1 (インスタンスプロパティ)
        user (インスタンスプロパティ)
        token (インスタンスプロパティ)
        toolBar (インスタンスプロパティ)
        viewDidLoad() (インスタンスメソッド)
        textFieldDidEndOnExit(_:) (インスタンスメソッド)
        textFieldShouldReturn(_:) (インスタンスメソッド)
        numberOfComponentsInPickerView(_:) (インスタンスメソッド)
        pickerView(_:titleForRow:forComponent:) (Int, インスタンスメソッド)
        pickerView(_:titleForRow:forComponent:) (String, インスタンスメソッド)
        tappedToolBarBtn(_:) (インスタンスメソッド)
    
[/code]

`ViewController3`には、`pickerView`なんて名前のインスタンスプロパティは存在せず、`pickerView`という名前では2種類のインスタンスメソッドが存在する(戻り値が`Int`の方は間違いでしょう)だけですから、Swiftは`self?.pickerView`と言う記述を見て、「どちらかの`pickerView`メソッドをクロージャーとして使いたいのだろうが、2種類あるんでどっちかわからない」→「曖昧な(Ambiguous)参照」と言っているのです。

`reloadAllComponents()`メソッドが定義されているのは`UIPickerView`ですから、あなたがそのメソッドを呼びたいインスタンスは`viewDidLoad()`メソッド内のローカル変数(`let
pickerView = UIPickerView()`で宣言されている方の`pickerView`)ですね。とりあえず該当部分を:

[code]

            token = realm.addNotificationBlock { (notification, realm) -> Void in
                pickerView.reloadAllComponents()
            }
    
[/code]

と修正すればコンパイルエラーは出なくなるはずです。(ただし、これだけであなたの所望の動作をするようになるかどうかはわかりません。)

  * インスタンスプロパティはクラスのインスタンスの中に保持され、インスタンスが存在する限りずっと存在し参照できる
  * ローカル変数はそのローカル変数が定義されたブロック用の一時的領域に保持され、そのブロックの実行が終了するとなくなって参照できなくなる
  * クロージャーにキャプチャーされたローカル変数は寿命が延長され、そのクロージャーが存在する限り存在し参照できる

と言ったインスタンスプロパティとローカル変数の特性をしっかり分かった上で、今はどちらを参照しているのか意識するようにしてください。  
あなたのコードの中では、`team`, `name`, `team1`,
`name1`の4つのプロパティはインスタンスプロパティにする必要は全くないように思われます。

あなたのコードを見ると、よくわからないまま変数を参照するコードを書く(コピッてきただけ?)→コンパイルエラーが出るとよくわからないまま変数を宣言するコードを適当な位置に書く→それでもコンパイルエラーが出るとよくわからないまま変数を宣言するコードを適当な位置に移動する、なんてことを場当たりでやっているようにしか見えません。

コンパイルエラーが出なければそれでOKとせずに、1行1行が何をやっているのか、きちんと理解しながら進めるようにしてください。


CC BY-SA 3.0
2016-04-09T00:34:52.163
23864
2016-04-09T01:32:05.877
2016-04-09T01:32:05.877
13972
13972
23862
answer