当没有索引时,通过 CellForRowAtIndexPath 中的数组进行索引
Posted
技术标签:
【中文标题】当没有索引时,通过 CellForRowAtIndexPath 中的数组进行索引【英文标题】:Index through an array from within CellForRowAtIndexPath when there is no index 【发布时间】:2013-01-07 16:42:07 【问题描述】:我已经使用来自 MagicalRecord(核心数据包装器)的查询结果填充了 NSArray
。我需要从cellForRowAtIndexPath:
中获取这些结果并将它们显示在UITableView
中的自定义单元格中,但索引引用另一个已选择的UITableView
。
我有两个UITableView
s;一个包含客户列表,另一个包含每个客户的约会列表。当用户选择客户时,代码会查找该客户的所有约会。因此,第二个表视图不涉及索引)。
第一个表视图有一个客户列表;当用户选择其中一个客户端时,第二个表视图将填充该选定客户端的约会列表。因此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
下方的行中,我如何在每次调用cellForRowAtIndexPath:
时遍历apptDataArray
,因为没有可应用于此数组的索引?
【问题讨论】:
数组怎么没有索引?它只包含一个对象吗?如果没有索引,那么数组和cellForRowAtIndexPath是什么关系? 【参考方案1】:来自
cellForRowAtIndexPath:
,但索引指向另一个已选择的UITableView
。
什么?!不,它没有。你有一个严重的误解。该方法的全称是tableView:cellForRowAtIndexPath:
。任何需要显示单元格的表格视图都将自己作为第一个参数传递,并将其自己的单个单元格*的索引路径作为第二个参数传递。当第二个表格视图向您的数据源询问其单元格信息时 - 当您的测试 tableView.tag == 2
测试为真时 - 传入的索引路径引用 该表格。否则它怎么可能工作?
你需要做的就是
AppointmentInfo *currentAppointment = [apptDataArray objectAtIndex: indexPath.row];
与任何其他支持数组的表视图相同。
这里没有魔法。您已经为表格视图提供了指向您的对象的指针,并告诉表格从该对象获取所需的信息。然后,该表向数据源对象发送消息,就像其他任何事情一样。其中一条消息是tableView:cellForRowAtIndexPath:
。另一个表视图也发送该消息的事实有时不会影响第一个。每个表视图将仅代表自己与您的数据源交互。
请注意,这个问题——甚至是对应用程序结构的描述——强烈表明您可能应该为每个表视图拥有一个单独的数据源/委托对象。 p>
*在 cmets 中的某处,您似乎暗示您认为需要在一次调用 tableView:cellForRowAtIndexPath:
期间设置表格视图中的所有单元格,这也不对。您只需要配置并返回与索引路径对应的单个单元格。
【讨论】:
该死!确实如此!谢谢乔希的澄清。至于它的价值 - 我至少在归还 ONE 细胞方面做得对……今天学到了一些新东西……再次感谢! @spokane-dude:没问题。【参考方案2】:听起来您需要为每个客户创建一个约会数组,然后假设该数组名为 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
【讨论】:
不,这行不通...请参阅上面的更新...每个客户有多个约会。我正在考虑在 cellForRowAtIndexPath 中使用单例作为 apptDataArray 的索引。 那也行不通...我已经根据访问的 UITableView 设置了 numberOfRowsInSection。问题是没有办法(除了使用单例)从 cellForRowAtIndexPath 中迭代 apptDataArray。如果您在 apptDataArray 中有 4 行,则每次通过 CellForRowAtIndexPath 时,您用于索引的任何整数都将被重置(即在 Foreach 语句中),除非它是单例。我希望除了单例之外还有另一种方法。 您用于 tableview1 的客户端对象是否在客户端级别对客户端约会进行了任何类型的分组?我想知道你是否可以做一些事情,比如从表一中的选定行中获取对象,然后从那里访问数据以填充第二个表视图? 这正是我所做的...在表 1 中选择客户端,从名称和电话号码的后 4 位创建密钥,并使用该密钥访问核心数据存储中的所有记录. MagicalRecord 在 NSArray 中返回结果,然后必须将其填充到 table-2 中的单元格中。 我刚刚创建了一个聊天室chat.***.com/rooms/22335/…以上是关于当没有索引时,通过 CellForRowAtIndexPath 中的数组进行索引的主要内容,如果未能解决你的问题,请参考以下文章
仅当更新前不存在用户时如何将用户添加到索引 Elasticsearch