我一直收到这个错误:
2013-03-30 19:48:40.029 try [14838:907] - [__ NSSetM objectAtIndex:]:无法识别的选择器发送到实例0x1e8ea660 2013-03-30 19:48:40.030尝试[14838:907] *由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSSetM objectAtIndex:]:无法识别的选择器发送到实例0x1e8ea660' * 第一次抛出调用堆栈: (0x33e523e7 0x3bb43963 0x33e55f31 0x33e5464d 0x33dac208 0xe5bc7 0x35cac569 0x35c91391 0x35ca8827 0x35c648c7 0x35a10513 0x35a100b5 0x35a10fd9 0x35a109c3 0x35a107d5 0x35a10639 0x33e27941 0x33e25c39 0x33e25f93 0x33d9923d 0x33d990c9 0x3797733b 0x35cb52b9 0x7b495 0x3bf70b20) libc ++ abi.dylib:terminate调用抛出异常 (lldb)
//继承我的代码:
- (void)fetchTweets
{
UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* data = [NSData dataWithContentsOfURL:
[NSURL URLWithString: @"***.json"]];
NSError* error;
tweets = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return tweets.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"showVideo";
CustomVideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell)
{
cell = [[CustomVideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
UIImageView *av = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 277, 58)];
av.backgroundColor = [UIColor clearColor];
av.opaque = NO;
av.image = [UIImage imageNamed:@"cell_bg.png"];
cell.backgroundView = av;
UIImage *image = [UIImage imageNamed:@"disclosure_arrow_white.png"];
UIImageView *av2 = [[UIImageView alloc] initWithFrame:CGRectMake(44.0, 44.0, image.size.width, image.size.height)];
av2.backgroundColor = [UIColor clearColor];
av2.opaque = NO;
av2.image = [UIImage imageNamed:@"disclosure_arrow_white.png"];
cell.accessoryView = av2;
NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];
cell.title.text = [tweet objectForKey:@"title"];
NSLog(@"t: %@",[tweet objectForKey:@"title"]);
return cell;
}
答案 0 :(得分:1)
您可以尝试保留tweets
即
tweets = [[NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error] retain];
以及之后的release
dealloc
。我猜它是一个自动释放的对象被分配给它。
答案 1 :(得分:0)
行后:
CustomVideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
您需要检查该单元格是否实际具有值,如果不存在,则创建一个新单元格。
CustomVideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell)
{
cell = [[CustomVideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier];
}
祝你好运!
更新您的新错误:
JSONObjectWithData产生的'tweets'变量是NSDictionary,而不是NSArray。由于NSDictionary没有实现'objectAtIndex',因此抛出了无法识别的选择器异常。通常情况下,推文字典应该包含一个包含推文数组的键,您应该将其分配给fetchTweets方法中的“tweets”变量。
如果你不确定我所指的很多东西,那么我强烈建议你使用Sensible TableView框架。该框架将能够自动为您提取所有Web服务推文,并自动在表视图中显示它们。我个人现在总是使用它,节省了大量的手工劳动。