当没有索引时,从CellForRowAtIndexPath内的数组中索引

时间:2013-01-07 16:42:07

标签: objective-c cocoa-touch nsarray uitableview

我已经使用MagicalRecord(核心数据包装器)的查询结果填充了NSArray。我需要获取这些结果并将其显示在UITableViewcellForRowAtIndexPath:内的自定义单元格中,但该索引会引用已选择的另一个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:,因为没有可以应用于此的索引阵列

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

  

来自cellForRowAtIndexPath:,但索引是指已被选中的另一个UITableView

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

您需要做的就是

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

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

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

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


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