2017-03-26 4 views
0

私は、UITableViewController内のすべてのセルをループする関数を作成しています。ここに私がこれまで持っているものがあります:Int対IndexPathのトラブル

var i = 0 
while (i < tableView.numberOfRows(inSection: 0)) { 
    i += 1 
    let cell = tableView.cellForRow(at: i-1) 
} 

セルを取得しようとするまで、すべてが正しくループします。それはタイプIndexPathの入力を期待していますが、私はIntで渡しています。いつでも私はIndexPathとして強制するでしょう:

let cell = tableView.cellForRow(at: i-1 as! IndexPath) 

私はいつも失敗する/常にnilを返すと警告を受けます。これを行うためのよりよい方法があるのか​​、それとも私はちょうど重要なステップを欠いていますか?どんな助けでも大歓迎です。前もって感謝します!

編集(少し詳細説明):すべてのセルは、カスタムクラスのセルであり、特定の変数を持ちます。私はすべての細胞をループして、その値を取得したい。

let visibleCells = tableView.visibleCells 
for aCell in visibleCells { 
    print(aCell.question?.text) <------- this is the value I want 
} 
+1

あなたの質問とは無関係ですが、すべてのセルをループする試みが間違っていることをほとんど保証できます。そのループの実際の目標は何ですか? – rmaddy

+0

おそらくrmaddyのようにあなたの実際の目標に応じて 'tableView.visibleCells'を使う方が良いでしょう。 –

+0

すべてのセルは、特定の変数を持つカスタムクラスセルです。私はすべての細胞をループして、その値を取得したい。 –

答えて

2

あなたはこのように、コードを経由してIndexPathを作成する必要があります。

let ndx = IndexPath(row:i, section: 0) 

それとも、あなたのコードを変更する:あなたが欲しいことを言及し、後で編集に基づいて

var i = 0 
while (i < tableView.numberOfRows(inSection: 0)) { 
    i += 1 
    let ndx = IndexPath(row:i-1, section: 0) 
    let cell = tableView.cellForRow(at:ndx) 
} 

各行のテキスト文字列の値は、私は上記がおそらくこれに近づく最善の方法ではないことを示唆しています:)(私は他の人がすでにこれを言っていることを知っていますが、あなたが望むものについて仮定をしたくない

cellForRowAt:を介してテーブルビューのセルにデータを入力するのと同じアプローチを取って、質問のテキストをすべてループするよりもよいでしょう表の行が表示されるため、他の行がすでに表示しているように見えない行に問題が発生します。

あなたは、cellForRowAt:ために提供されたデータを取得してすべての問題を持ってくれてcellForRowAt:ためのコードを共有しないと私たちの一つは、あなたが物事を把握することができます確信している場合:)

+0

なぜ 'for'ループの代わりに' while'ループを使うのですか?現在の値を使う前に 'i'をインクリメントするのはなぜですか? – rmaddy

+1

@rmaddy私は彼がいくつかの論理を念頭に置いていると仮定しているので、単に彼が提供したロジックを使用していますが、私は間違っている可能性があります:) – Fahim

+0

OPはちょうど始まり、彼がやっていることを本当に理解していないと思います。彼は実際の目標を確実に伝える必要があります。 –

0

をお試しください
let indexPath = IndexPath(row: i, section: 0) 

必要に応じてセクションを調整する必要がある場合があります。

IndexPathのドキュメントをご覧ください。ほとんどのクラスや構造と同様に、IndexPathinitializersです。オブジェクトの新しいインスタンスを作成する必要がある場合は、初期化子を使用するのが最も好きでしょう。

*また、@rmaddyからのコメントを参照してください: "あなたの質問とは無関係ですが、すべてのセルをループする試みが間違っていることをほとんど保証することができます。 "

2

以下の他の回答やコメントで他の人が言ってきた情報のほとんどが、私は一つの場所にそれをすべて置くことを望んでいた:私たちは質問の詳細から一歩と依頼する必要があり

何あなたは実際にやろうとしています。

UITableViewメソッドcellForRow(at:)は、実際に画面に表示されているセルのみを返します。5つのセルのための空きがあり、残りを公開するためにスクロールする必要がある場合、そのメソッドは、表示されているセルを除くすべてのセルに対してnilを返します。

他の人も示唆しているように、画面上にあるセルをループすることが目的の場合は、プロパティーtableView.visibleCellsが適しています。

あなたの目標がデータに存在するすべてのセルをループすることであれば、何をしようとしているのかを説明する必要があります。

具体的な質問についてはcellForRow(at:)IndexPathのパラメータが必要です。単にIntをIndexPathにキャストすることはできません。それは失敗するでしょう。代わりに、@TaylorMが答えて言ったように、IndexPathを作成する必要があります。あなたのテーブルビューは、単一のセクションを持っているなら、あなたは、単にそれはまたしばらく使用しても意味がありません

let indexPath = IndexPath(row: i, section: 0) 

(あなたのインデックスは0から始まりますので、あなたのループのコードを修正すると仮定)

を使用することができますそのようなループ。代わりに、このすべての

は、私が使用することをお勧め:

let visibleCells = tableView.visibleCells 
for aCell in visibleCells { 
    //Do something with the cell 
} 
0

私は私はあなたの素晴らしい人々からの助けのすべてを使用してそれを考え出したと信じています。

私の場合、私はアクセスしたい変数を持つカスタムクラスを持っています。 let indexPath = IndexPath(row: i, section: 0)

最後にas! NumberTableViewCellを追加すると、ここに定義されている値にアクセスできます。これは、私がTaylor M、Fahim、Duncan Cが言ったことです。結局、次のようになりました。

var i = 0 
while (i < tableView.numberOfRows(inSection: 0)) { 
    i += 1 
    var cell = tableView.cellForRow(at: IndexPath(row: i-1, section: 0)) as! NumberTableViewCell 
    print(cell.question.text!) 
    } 

ありがとうございました!

+0

これは単に間違っています。セルからデータを取得する必要はありません。セルはデータを一時的にしか表示しません。データモデルにはすべてのデータが必要です。セルではなくデータモデルを繰り返し処理するだけです。 – rmaddy

+0

私はrmaddyに同意します。データをセルに保存しないでください。セルがオフスクリーンでスクロールするたびに、リサイクルされ、そのデータは失われます。テーブルビューに表示する情報とユーザーからの入力を保持するデータモデルが必要です。配列は1つのセクションを持つテーブルビューでうまく動作します。配列の配列は、セクション化されたテーブルビューでうまく機能します。 –

+0

このテーブルビューには、最大で約6つのセルしかないので、これは適切な方法だと思いました。ありがとう! –