我的数据结构如下所示:
在NSArray
内部我有来自不同类的一些对象。如果像这样的话,数组的外观如何:
让我们说myArray
有3 objectA
秒。每个objectA
和NSArry
都有objectB
s
现在在运行时我不知道数组计数。
我的UITableView
每个部分显示一个objectA
。每个部分有1行。除非我的objectA
的NSArray为objectB
,且计数大于0.
如果UITableView
所有objectA
中没有objectB's
数组,Section 1: Row 1: `objectA instance
Section 2: Row 1: `objectA instance
Section 3: Row 1: `objectA instance
就会如此。
objectA
让我们说第3个objectB
有一个UITableView
数组,其数量为1.我的Section 1: Row 1: `objectA instance
Section 2: Row 1: `objectA instance
Section 3: Row 1: `objectA instance
Section 3: Row 2: `objectB instance
看起来像这样:
UITableViewCell
现在我为每个object
使用了两个不同的objectA
,因此CustomCell1
将使用objectB
而CustomCell2
将使用UITableView
这是我被卡住的地方 - 我需要将正确的单元格返回到正确的部分/行。
所以我确保我的-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
ObjectA *objectA = self.myArray[section];
return [objectA.objectBArray count] +1;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [self.myArra count];
}
知道会发生什么。
我写了这样的方法:
numberOfRowsInSection
所以objectB
看一下numberOfSectionsInTableView
s数组并返回它的计数+ 1,这样即使它的0总是有一行。 (我在当前部分中至少需要一行objectA。
objectA
是直截了当的 - self.myArray
cellForRowAtIndexPath
的一个部分
这似乎完全符合我的需要。
然后我陷入 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell1 *cell1 = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
CustomCell2 *cell2 = [tableView dequeueReusableCellWithIdentifier:@"cell2"];
ObjectA *objectA = self.myArray[indexPath.section]; //Each section has one ObjectA.
//Make sure we have some objectB's to display first
if ([objectA. objectBArray count] > 0){
ObjectB *objectb = (ObjectB*) objectA.objectB[indexPath.row];
//if the current section (section 3) has a indexPath 0 already
// index path 1 would have the first objectB
}
cell1.objectA = objectA;
cell2.objectB = objectB;
//Now return the correct cell for the current section / index path
}
方法。
这是我走了多远:
objectB
所以我需要检查当前部分是否已经有有效的cell1对象,如果是的话我需要将cell2返回到第二行或第三行。 for numberOfRowsInSection
因为第一行必须始终有一个cell1。
我知道我快到了。我只是无法弄清楚如何返回正确的细胞。
更新
所以cellForRowAtIndexPath方法只被调用三次。这是我在 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
ObjectA *objectA = self.myArray[section];
NSLog (@"Section:%ld", (long)section);
NSLog(@"Returning %ld", (long)[objectA.objectBArray count]+1);
return [objectA.objectBArray count] +1;
}
方法中所做的,以确保它返回正确的行数:
2014-07-16 19:36:17.488 App[15473:60b] Section:2
2014-07-16 19:36:17.488 App[15473:60b] Returning 2
2014-07-16 19:36:18.128 App[15473:60b] Section:0
2014-07-16 19:36:18.128 App[15473:60b] Returning 1
2014-07-16 19:36:19.063 App[15473:60b] Section:1
2014-07-16 19:36:19.063 App[15473:60b] Returning 1
我的控制台显示了这个:
{{1}}
有什么想法吗?
答案 0 :(得分:1)
如果每个部分中始终只有一个objectA
,那么您可以测试indexPath.row
是否大于零(不是第一行)。
看看这是否有效:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell1 *cell1 = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
CustomCell2 *cell2 = [tableView dequeueReusableCellWithIdentifier:@"cell2"];
ObjectA *objectA = self.myArray[indexPath.section]; //Each section has one ObjectA.
cell1.objectA = objectA;
//Check if not first row and objectB's exist
if (indexPath.row > 0 && [objectA. objectBArray count] > 0){
ObjectB *objectb = (ObjectB*) objectA.objectB[indexPath.row];
cell2.objectB = objectB;
return cell2;
}
return cell1;
}
答案 1 :(得分:0)
这是我遇到的第二个问题的答案。在我的视图控制器中设置断点后 - 我注意到我的tableView在调用[self.tableView reloadData]之前已经加载了单元格;
不确定为什么会发生这种情况所以快速检查我的行for items方法解决了这个问题:
如果主数组没有对象 - 返回0.如果确实 - 返回objectBArray count + 1;现在,cellForRowAtIndexPath被称为正确的次数。