在我的应用程序中,我正在使用UITableview
。在那个TableView中,我正在显示一个包含字典的数组。 TableView的最后一行包含一个按钮,指示用户加载更多事件。如果用户点击该按钮,我们需要从服务获取数据并加载UITableview
中的数据。
为此,我试图像下面的代码那样实现它:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section**
{
if (ifMore)
{
return [totalArray count];
}
else
{
return [tableArray count];
}
return 0;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
int count =[tableArray count];
if (ifMore)
{
count= [totalArray count];
}
if (indexPath.row==count-1)
{
return 96;
}
return 56;
}
行索引方法的单元格是:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
TableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell = [[TableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
NSMutableDictionary *dict=[[NSMutableDictionary alloc]init];
if (ifMore)
{
dict=[totalArray objectAtIndex:indexPath.row];
}
else
{
dict =[tableArray objectAtIndex:indexPath.row];
}
cell.hostLabel.text=[dict objectForKey:@"Event_Name"];
cell.startTime.text=[dict objectForKey:@"Event_Startdate"];
cell.endTime.text= [dict objectForKey:@"Event_Enddate"];
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
int count=[tableArray count];
if(ifMore)
{
count=[totalArray count];
}
if (indexPath.row==count-1)
{
[cell.contentView addSubview:moreBtn];
}
return cell;
}
我正在使用这样的代码。现在我的主要问题是当我正常加载数据时,加载滚动时不会出现任何问题。它的工作完美。但是,当我单击TableView单元格中的按钮并从服务获取数据并重新加载数据时。它工作正常。但是当我滚动它时会崩溃。我坚持这个。
崩溃讯息是:
2012-12-20 12:22:49.312 IAGDapp[3215:15e03] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 4 beyond bounds [0 .. 3]'
*** First throw call stack:
(0x4b5052 0x21c7d0a 0x4a1db8 0x2b9e6 0x2b7d2 0xc80a57 0xc80b92 0xc8669e 0x7402db 0x7401af 0x489966 0x489407 0x3ec7c0 0x3ebdb4 0x3ebccb 0x1f6b879 0x1f6b93e 0xc2ba9b 0x28e0 0x2105 0x1)
terminate called throwing an exceptionsharedlibrary apply-load-rules all
kill
你能帮我找到错误吗?
答案 0 :(得分:1)
此处在此处单击UIButton
单元格后,您将从服务中获取另一个数据,并且在您希望将此数据加载到同一个表中之后,请按照此步骤进行操作。
首先获取数据,然后在tableArray和totalArray中添加此数据。
在重新加载表之后。
它崩溃了,因为这里没有找到这个新的更新数组的numberOfRows和其他方法。
答案 1 :(得分:1)
我同意帕拉斯的观点。我看不到将数据提取到数组中的部分,但如果省略正确重新加载数据/从错误的数组/设置ifMore
变量获取数据,您的应用程序将崩溃。首先你应该检查它们。如果您认为没有错,请在numberOfRowsInSection
内设置一个断点,并查看为什么它返回4,您希望有4个以上的单元格。
但实际上,我认为你不需要两个不同的数组和ifMore
变量用于此目的。拥有一个数组,在获取数据后更新它,重新加载表并删除带有ifMore
变量的totalArray和所有if语句。简单可能有助于稳定。
答案 2 :(得分:0)
问题在于你的循环。
if (indexPath.row==count-1)
{
return 96;
}
您的数组计数为4,并且您尝试在tableview中加载96行。因此,您的应用程序正在崩溃。
问题不在于滚动UITableView。问题是在表中加载数组。
答案 3 :(得分:0)
似乎ifMore变量没有像你期望的那样工作。由于错误日志索引4超出了界限[0 .. 3] ,很明显,tableview的数据源只包含3个元素,但是你在numberOfRowsInSection中返回的计数是4。
作为替代解决方案,如果您希望更多按钮始终作为数据源的最后一行,为什么不能使用单个数组执行此操作。只需在tableArray.count + 1
方法中返回numberOfRowsInSection
(更多按钮)。在cellForRowAtIndexPath
中,检查索引是否高于tableArray.count
,然后创建按钮。与heightForRowAtIndex
方法相同。