0

在我的应用程序中,我正在使用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

你能帮我找出错误吗?

4

4 回答 4

1

在这里,当您单击UIButton此处之后的单元格时,您会从服务中获取另一个数据,并且在您想将此数据加载到同一个表中之后,请按照此步骤操作。

  1. 首先,当您获取数据时,然后将此数据添加到您的 tableArray 和 totalArray 中。

  2. 在重新加载表之后。

它的崩溃是因为这里 numberOfRows 和其他方法都没有找到这个新的更新数组。

于 2012-12-20T07:24:43.023 回答
1

我同意帕拉斯的观点。我看不到您将数据提取到数组中的部分,但如果您忽略正确重新加载数据/从错误的数组/设置ifMore变量中获取数据,您的应用程序将崩溃。首先,您应该检查它们。如果您认为没有问题,请在里面设置一个断点numberOfRowsInSection,看看为什么它会在您想要 4+ 个单元格的地方返回 4。

但实际上,我认为您不需要ifMore为此目的使用两个不同的数组和变量。有一个数组,在获取数据后更新它,重新加载表并删除 totalArray 和所有带有ifMore变量的 if 语句。简单可能有助于稳定。

于 2012-12-20T08:09:28.923 回答
0

似乎 ifMore 变量没有像您预期的那样工作。由于错误日志是 index 4 beyond bounds [0 .. 3],很明显,tableview 的数据源仅包含 3 个元素,但您在 numberOfRowsInSection 中返回的计数为 4。

作为替代解决方案,如果您希望“更多”按钮始终作为数据源中的最后一行,为什么不能使用单个数组来完成。只需在方法中返回tableArray.count + 1(更多按钮)numberOfRowsInSection。在cellForRowAtIndexPath中,检查索引是否高于tableArray.count,然后创建按钮。heightForRowAtIndex方法也一样。

于 2012-12-20T07:40:41.970 回答
0

问题是你的循环。

if (indexPath.row==count-1) 
{

return 96;

}

您的数组计数为 4,您正在尝试在 tableview 中加载 96 行。因此,您的应用程序正在崩溃。

问题是不滚动 UITableView。问题是在表中加载数组。

于 2012-12-20T07:15:59.307 回答