0

我已经填充了NSArray来自 MagicalRecord(核心数据包装器)的查询结果。我需要获取这些结果并将它们显示在UITableViewfrom within的自定义单元格中cellForRowAtIndexPath:,但索引引用了另一个UITableView已选择的索引。

我有两个UITableView;一个包含客户列表,另一个包含每个客户的约会列表。当用户选择客户时,代码会查找该客户的所有约会。因此,第二个表视图不涉及索引)。

第一个表视图有一个客户列表;当用户选择其中一个客户端时,第二个表视图将填充该选定客户端的约会列表。因此,index.row指的是第一个UITableView,而第二个没有它可以引用的索引。我只是将内容转储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,我如何遍历apptDataArray每次cellForRowAtIndexPath:调用,因为没有可以应用于该数组的索引?

4

2 回答 2

1

从内部,cellForRowAtIndexPath:但索引指的是另一个UITableView已选择的。

什么?!不,它没有。你有一个严重的误解。该方法的全称是tableView:cellForRowAtIndexPath:. 任何需要显示单元格的表格视图将其自身作为第一个参数传递,并将其自己的单个单元格*的索引路径作为第二个参数传递。当第二个表视图向您的数据源询问其单元格信息时(当您的测试tableView.tag == 2测试为真时),传入的索引路径引用该表。否则它怎么可能工作?

你需要做的就是

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

与任何其他支持数组的表视图相同。

这里没有魔法。您已经为表格视图提供了指向您的对象的指针,并告诉表格从该对象获取所需的信息。然后,该表向数据源对象发送消息,就像其他任何事情一样。其中一条消息是tableView:cellForRowAtIndexPath:. 另一个表视图也发送该消息的事实有时不会影响第一个。每个表视图将代表它自己与您的数据源交互。

需要注意的是,这个问题——甚至是对应用程序结构的描述——强烈表明您可能应该为每个表视图拥有一个单独的数据源/委托对象。


*在评论中的某处,您似乎暗示您认为您需要在一次调用期间设置表格视图中的所有单元格,tableView:cellForRowAtIndexPath:这也是不对的。您只需要配置并返回与索引路径对应的一个单元格。

于 2013-01-07T19:06:37.603 回答
1

听起来您需要为每个客户创建一个约会数组,然后假设该数组名为 apptDataArray,下面的代码将起作用。单击第一个 tableview 上的一行将使用客户端创建约会数组列表并使用该数据重新加载第二个 tableview。每个约会都是一行。

如果您正在获取所有数据并且所有结果都存储在 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 回答