0

我创建了一个通用主详细信息应用程序。我在 iPad 和 iPhone 上使用了 Storyboard。我实际上是在发出一个 HTTP 请求来检索将在主表视图中显示的所需数据。我从 requestFinished 方法重新加载 tableview 数据。

- (void)requestFinished:(ASIHTTPRequest *)request {

NSString *responseString = [request responseString];

ConversationDataController *dataControllerSingleton = [ConversationDataController sharedInstance];

conversationList = [responseString JSONValue];

[dataControllerSingleton setConversationList:conversationList];

[self.tableView reloadData];
}

我将返回的数据存储在 dataControllerSingleton 中,它有一个名为 conversationList 的 NSMutableArray 属性。

在 numberOfRowsInSection 中,我根据 fetchedResultsController 打印出该部分中的对象数。我还打印出我的 NSMutableArray 对话列表中的值的数量。在 numberOfSectionsInTableView 我打印出部分的数量。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
NSLog(@"Number OF Objects in section %lu",(unsigned long)[sectionInfo numberOfObjects]);
ConversationDataController *dataControllerSingleton = [ConversationDataController sharedInstance];

NSLog(@"ConversationList count %lu",(unsigned long)[dataControllerSingleton.conversationList count]);

return [sectionInfo numberOfObjects];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {
NSLog(@"Number of sections: %d",[[self.fetchedResultsController sections] count]);
return [[self.fetchedResultsController sections] count];
}

所以,当我使用 NSLog 查看我有多少部分和行时,我得到了第 2 部分中的对象数 ConversationList count 46
Number of Sections 1

在我的 cellForRowAtIndexPath 中,我从 NSMutableArray 添加单元格文本

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView
                         dequeueReusableCellWithIdentifier:@"ConversationCell"];
[self configureCell:cell atIndexPath:indexPath];

ConversationDataController *dataControllerSingleton = [ConversationDataController sharedInstance];
cell.textLabel.text = [dataControllerSingleton.conversationList objectAtIndex:indexPath.row];

return cell;
}

因此,通过此设置,我在 iPhone 和 iPad 的主视图中看到了两个值。当我在主视图中选择其中一个值时,我会进入详细视图(现在它只是空的)。这对于显示的两行没有任何错误。

如果我更改 numberOfRowsInSection 以返回 NSMutableArray 中的值数,则返回 [self.conversationList count]; 我遇到错误。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
NSLog(@"Number OF Objects in section %lu",(unsigned long)[sectionInfo numberOfObjects]);
ConversationDataController *dataControllerSingleton = [ConversationDataController sharedInstance];

NSLog(@"ConversationList count %lu",(unsigned long)[dataControllerSingleton.conversationList count]);

//return [sectionInfo numberOfObjects];
return [self.conversationList count];
}

在 iPhone 模拟器上,我在主视图中看到了 46 个值。我可以选择其中任何一个,然后我会看到(空的)详细视图。在 iPad 模拟器上,如果我选择前两个单元格中的一个,我会按预期显示(空)详细视图。但是,当我选择前两个以外的任何值时,会出现以下错误;

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -     [_PFBatchFaultingArray objectAtIndex:]: index (2) beyond bounds (2)'
*** First throw call stack:
(0x19a5012 0x17cae7e 0x19a4deb 0x156941a 0x15e9511 0x42fe9 0x4ae285 0x4ae4ed 0xeb85b3   0x1964376 0x1963e06 0x194ba82 0x194af44 0x194ae1b 0x249b7e3 0x249b668 0x3feffc 0x40e0d 0x2ac5)
libc++abi.dylib: terminate called throwing an exception

任何帮助将不胜感激。提前致谢。蒂姆

4

2 回答 2

0

如果您使用多个部分(看起来像您),那么委托方法

tableView:(UITableView *)tableView cellForRowAtIndexPath:

真的应该处理这个。

您似乎还混合使用 NSFetchedResultsController 来计算节数和行数,然后使用属性 self.conversionList 来返回行数。但是对于哪个部分。如果您想使用核心数据,那么不要使用带有数组的单例,而是将 Web 服务器中的数据缓存到核心数据表中,然后在您的

- (NSFetchedResultsController *)fetchedResultsController

方法。

你也在混合使用 self.conversionList &

ConversationDataController *dataControllerSingleton = [ConversationDataController sharedInstance];
dataControllerSingleton.conversationList

他们都一样吗?

于 2013-03-05T02:33:42.473 回答
0

请将 libz.dylib 添加到您的项目中。它可以添加到构建阶段选项卡中。那里有二进制库部分的链接。单击“+”符号并将 libz.dylib 添加到您的项目中

于 2013-03-04T04:42:03.420 回答