2017-02-16 6 views
0

私は現在、プログラムを完全にプログラム的に構築する方法を学んでおり、その過程で少し壁を打っています。Swiftを使ってテーブルビュー内でUITextViewを反復する

私のアプリは、ユーザーが記入できるかなりシンプルなフォームになり、最後に情報を含むPDFが生成されます。基本的な情報については、私はUITextfieldsのセットを含むテーブルビューを持っており、それらを反復し、データを文字列の配列に抽出することに問題はありません。 次のセクションでは、より多くのテキストを入力する必要があったため、テーブルビュー内でUITextviewを使用しました。私ができるようにしたいのは、入力されたテキストを抽出し、顧客オブジェクトを作成するために使用される文字列の配列に保存することです。

func createGoals() { 
    for section in 0..<secondTableView.numberOfSections { 

     for row in 0..<secondTableView.numberOfRows(inSection: section) { 

      let indexPath = NSIndexPath(row: row, section: section) 
      let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 
       if thisCell.textview.text == "Enter Goals" { 
       print("NO CONTENT IN FIELD") 
       let ac = UIAlertController(title: "But...But...", message: "If you have no goals, how can you progress?!", preferredStyle: .alert) 
       ac.addAction(UIAlertAction(title: "OK", style: .default)) 
       present(ac, animated: true) 
       break 
       } else { 
        print("I MADE IT") 
        print("\(thisCell.textview.text!)") 
        newClient.goalArray.append(thisCell.textview.text) 
        print(newClient.goalArray) 
        } 
     } 
    } 

} 

しかし、これを実行すると、私はエラーメッセージがこの行を「オプションの値をアンラップしながら、予想外にnilを見つけ」、それは特にハイライトを取得:次のようにこれを実行するコードがある

let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 

このコードはUITextfieldsをどのように反復するのかとほとんど同じですが、変更されたものはすべて変数に添付されています。 また、私はUITextviewsを記入しないとUIAlertControllerが表示されますが、プレースホルダを削除してUITextviewsを記入すると問題があるようです。 これはなぜ起こっているかについて誰かが考えていますか?私は、必要に応じて、より多くのコードを提供することができます。

+0

デバッガは、secondTableViewに、渡した行にセルが含まれていないことを伝えています。 secondTableViewの行数を確認すると役立ちます。 – ystack

+0

私はデバッガで試したところ、セクション0の4行を期待どおりに返しています。行は間違いなくそこにあるので、私のforループは何とか1つを欠場することができますか? – EtherCode

+0

'mySecondCell'はインスタンスであり、クラスではありません。あなたはクラスの型としてセルを取得する必要があります。 'let thisCell = secondTableView.cellForRow(at:IndexPathとしてのindexPath)を! MyCellSubclass'、またはガード 'guardを使用する方が良いでしょうか?thisCell = secondTableView.cellForRow(at:IndexPathとしてindexPath)を? mySecondCell else {return} ' –

答えて

0

は、ここでは、適切なクラスを登録しなかった場合thisCellmySecondCell

チェックはありませんが、明らかにあなたのオプション

as! mySecondCell 

ある

EDITは

あなたはいけませんデリゲートメソッドを自分で呼び出す

+0

ああ、私はまだ強制的なダウンキャストが違っていると思ったオプションとしてカウントしたことを知らなかった。ここで私はそれを登録した方法です、私はそれが正しいと確信していますか? VDL内 : 'secondTableView.delegate =自己 secondTableView.dataSource =自己 secondTableView.register(mySecondCell.self、forCellReuseIdentifier: "secondCellID")'、 またcellForRowで: 「のtableView場合==セルフ.secondTableView { bCell = secondTableView.dequeueReusableCell(withIdentifier: "secondCellID"、for:indexPath)を! mySecondCell '、 これは正しい登録方法ですか? – EtherCode

+0

あなたは正しいかもしれません。このコードを使用していた場所には注意を払っていませんでした。あなたはKalpesh jetaniの答えを読むべきです。彼は正しい、あなたは自分でデリゲートメソッドを呼び出すことはできません – Acrasia

0

ここでは、繰り返しでセルをロードしています。表示されていないセルにロード/アクセスしようとしているために問題が発生します。

ここでは、cellForRowAtIndexPathのセルを読み込まないでください。

理由:UITableViewは、reusableCellIdentifierでセルを再利用しています。

ここでは、textfield-didEndEditing(textfield delegateメソッド)が呼び出されたときに配列または辞書に値を保存する必要があります。 とバリデーションチェックのためにarray/dictionaryから保存された値を使用することができます。

+0

賢いよ、私はそんなやり方で試して見ます。 textFieldを反復処理するときに反復処理内のセルをロードするのが完全に機能するが、textViewsを使用しないときは、何らかの理由があるのでしょうか? – EtherCode

+0

それがtextFieldsで動作しているなら、weakでないときはtextViewsで動くはずです。 tableview.visiblecellsを反復すると、上記の問題は発生しません。ここではあなたの仕事は完全ではありません。 textviews/Textfieldsから変更された値を取得するには、didEndEditingに保存する必要があります。 まだ問題があります、カテゴリ/エクステンションもしくはスーパークラスをチェックしてください。 –

関連する問題