0

NSArrayMagicalRecord(コアデータラッパー)からのクエリの結果をに入力しました。UITableViewこれらの結果を取得して、内からカスタムセルに表示する必要がありますcellForRowAtIndexPath:が、インデックスはUITableView選択された別のセルを参照しています。

私は2つ持っていUITableViewます。1つには顧客のリストが含まれ、もう1つには各顧客の予定のリストが含まれます。ユーザーが顧客を選択すると、コードはその顧客のすべての予定を検索します。そのため、2番目のテーブルビューに関連するインデックスはありません)。

最初のテーブルビューにはクライアントのリストがあります。ユーザーがこれらのクライアントの1つを選択すると、2番目のテーブルビューに、その選択されたクライアントの予定のリストが表示されます。したがって、index.rowは最初のを参照しUITableView、2番目は参照できるインデックスを持っていません。apptDataArrrayの内容をセルにダンプするだけです。

これが私のコードです:

if(tableView.tag == 2) {  //  appointment info  
    static NSString *cellIdentifier = @"apptListCell";
    ApptCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if(cell == nil)  {
        cell = [[ApptCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    //  configure the cell...
    AppointmentInfo *currentAppointment = [apptDataArray objectAtIndex: 0];  //  go through the array  <---- TODO

    // Set the dateFormatter format
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];  //  start date/time
    [timeFormatter setDateFormat:@"HH:mm:ss"];  //  end time

    UILabel *label = (UILabel *)[cell viewWithTag:3];  //  display start date/time  (NEEDS TO BE LOCALIZED!)<-----  TODO????
    label.text = [dateFormatter stringFromDate:currentAppointment.aStartTime];

    label = (UILabel *)[cell viewWithTag:4];  //  display end time
    label.text = [timeFormatter stringFromDate:currentAppointment.aEndTime];

    label = (UILabel *)[cell viewWithTag:5];  //  display service tech name
    label.text = currentAppointment.aServiceTech;

    return cell;

}

私の質問は次のとおりです。下の行で、この配列に適用できるインデックスがないため、が呼び出されるたび// configure the cellにどのように反復するのですか?apptDataArraycellForRowAtIndexPath:

4

2 に答える 2

1

クライアントごとに予定の配列を作成する必要があるようです。配列がapptDataArrayと呼ばれると仮定すると、以下のコードが機能します。最初のテーブルビューの行をクリックすると、クライアントを使用して予定配列リストが作成され、2番目のテーブルビューにそのデータが再ロードされます。各予定は行です。

すべてのデータを取得し、すべての結果がapptDataArrayに保存されている場合は、tableviewNumberOfRows値をapptDataArrayのサイズに設定できるはずです。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(tableView == table2Ivar){
      return [apptDataArray count];
    }
   //Else you are getting a list of unique clients
}

次に、セルを構成するときに結果エントリとテーブル行の間の相関関係を使用すると、各indexpath.rowがクライアントの予定のエントリになります。

AppointmentInfo *currentAppointment = [apptDataArray objectAtIndex: indexPath.row];

サンプルGitHubプロジェクト https://github.com/propstm/twoTableTest

于 2013-01-07T16:52:47.490 に答える
1

内部からですcellForRowAtIndexPath:が、インデックスはUITableView選択された別のものを参照しています。

何?!いいえ、そうではありません。あなたには深刻な誤解があります。そのメソッドのフルネームはですtableView:cellForRowAtIndexPath:。セルを表示する必要のあるテーブルビューは、最初の引数としてそれ自体を渡し、2番目の引数としてそれ自体の単一セル*のインデックスパスを渡します。2番目のテーブルビューがデータソースにセル情報を要求している場合(テストtableView.tag == 2テストがtrueの場合)、渡されたインデックスパスはそのテーブルを参照します。それ以外の方法でどのように機能する可能性がありますか?

あなたがする必要があるのは

AppointmentInfo *currentAppointment = [apptDataArray objectAtIndex: indexPath.row];

他の配列に裏打ちされたテーブルビューの場合と同じです。

ここでは魔法はありません。テーブルビューにオブジェクトへのポインタを指定し、そのオブジェクトから必要な情報を取得するようにテーブルに指示しました。次に、テーブルは、他のものと同じように、データソースオブジェクトにメッセージを送信します。それらのメッセージの1つはですtableView:cellForRowAtIndexPath:。別のテーブルビューもそのメッセージを送信するという事実は、最初のビューに影響を与えない場合があります。各テーブルビューは、それ自体に代わってのみデータソースと対話します。

注意として、この問題(アプリの構造の説明でさえ)は、テーブルビューごとに個別のデータソース/デリゲートオブジェクトが必要であることを強く示しています。


*コメントのどこかで、1回の呼び出し中にテーブルビューのすべてのセルを設定する必要があると思われるようですがtableView:cellForRowAtIndexPath:、それも正しくありません。インデックスパスに対応する単一のセルのみを構成して返す必要があります。

于 2013-01-07T19:06:37.603 に答える