推送和弹出视图控制器

时间:2012-08-21 15:42:53

标签: iphone objective-c ios uinavigationcontroller pushviewcontroller

我有一个导航视图控制器,它是一个表视图,然后从表视图中,如果我选择一行,它将进入详细视图页面。当我进入详细视图页面时,我从服务器检索一些信息,如果服务器没有响应,那么我会弹出一个警报视图,该视图出现在我的父导航视图前面。现在当在警报视图上按下确定并单击另一行时它会进入我的“didselectview”方法,但不会进入我的详细视图页面。谁会知道为什么?代码如下。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Navigation logic may go here. Create and push another view controller.
Item *selectedItem = (Item *)[self.fetchedObjectsArray objectAtIndex:indexPath.row];
NSString * urlString = [CONST_FEED_DISCRIPTION_URL stringByAppendingString:selectedItem.guid];
NSDate * dateString = selectedItem.date;
JsonViewController *jsonViewController = [[JsonViewController alloc] initWithURLString:urlString date:dateString];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                                               style:UIBarButtonItemStyleBordered
                                                              target:nil
                                                              action:nil];
self.navigationItem.backBarButtonItem = backButton;
self.navigationController.navigationBar.tintColor = [UIColor colorWithHexString:CONST_NAVIGATIONBAR_COLOR];
[self.navigationController pushViewController:jsonViewController animated:YES];
[backButton release];
[jsonViewController release];
}

第一次出现警报视图(这是一条错误消息)。之后,当你点击一行时没有任何反应。但我知道它进入下面给出的方法。谁会知道为什么?这与推动观点有什么关系吗?而不是弹出他们?

1 个答案:

答案 0 :(得分:1)

将推送推迟到下一个runLoop,让tableView返回:

dispatch_async(dispatch_get_main_queue(), ^ {
    NSLog(@"Going to push...");
    NSLog(@"...view Controller %@", jsonViewController);
    [self.navigationController pushViewController:jsonViewController animated:YES];
    [jsonViewController release];
    NSLog(@"Just pushed %@", jsonViewController);
) );

为了清楚起见,请从现有代码中删除这两行:

[self.navigationController pushViewController:jsonViewController animated:YES];
[jsonViewController release];