点击表格行推一个新视图

时间:2011-09-16 09:36:43

标签: iphone ios

我有一张桌子。当我点击表格行时,我想推送一个新视图。我知道在navigationController中有如何推送它,但我想使用这样的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic -- create and push a new view controller

    TasksViewController *tasks = [[TasksViewController  alloc] 
                    initWithNibName:@"Tasks" 
                    bundle:nil];

    LoginAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.window addSubview:[tasks view]];
    [self.view removeFromSuperview];        
}  

TaskViewCOntroller是我想要推送的视图。当我尝试执行此操作时,我有一个例外:

*** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:5678
2011-09-16 12:26:41.118 LeoAction[1149:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00df55a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x00f49313 objc_exception_throw + 44
    2   CoreFoundation                      0x00dadef8 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x000e03bb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x0035ac91 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 883
    5   UIKit                               0x003504cc -[UITableView(UITableView

我不知道如何处理此异常?

3 个答案:

答案 0 :(得分:2)

例外情况是告诉您tableView:cellForRowAtIndexPath:方法存在问题。听起来你没有为被调用方法的每个实例提供正确的返回路径。

检查在此方法结束时您是否有return cell;

至于导航,您应该执行以下操作:

[self.navigationController pushViewController:tasks animated:YES];

UIViewController为您定义导航控制器,因此推送新控制器就像实例化它并调用上述方法一样简单。

修改

关于导航控制器 - 当您设置顶级表视图控制器时,您需要它由UINavigationController拥有。为了简单起见,我假设您正在使用Interface Builder。

MainWindow.xib中,拖动导航控制器对象。展开其显示箭头,您将看到它包含导航栏和根视图控制器。选择此根视图控制器,然后在身份检查器中将其类更改为自定义表视图控制器,并在属性检查器中将其NIB名称字段更改为相应的nib。根据需要将导航控制器连接到App Delegate对象。

然后,您应该发现可以在pushViewController:animated:内使用self.navigationController tableView:didSelectRowAtIndexPath:方法。

我希望这会有所帮助。

答案 1 :(得分:-1)

你应该像这样推动它:

[self.navigationController pushViewController:taskViewController animated:YES];

答案 2 :(得分:-1)

你可以推出像贝娄一样

TasksViewController *tasks = [[TasksViewController  alloc] 
                initWithNibName:@"Tasks" 
                bundle:nil];

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