didSelectRowAtIndexPath抛出异常

时间:2011-09-26 07:56:22

标签: iphone objective-c ios

这可能是一些简单的错误,我似乎无法在我的代码中找到它。

当我点击tableview中的单元格时,我得到一个异常

这是我的界面:

@interface MenuViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@end

我不使用XIB文件,所以这是我的loadView

- (void)loadView
{
    UIView *myview = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.title = @"Menu";
    UITableView *tableViewMenuItems = [[UITableView alloc] initWithFrame:CGRectMake(10, 10, 300, 150) style:UITableViewStyleGrouped];
    tableViewMenuItems.backgroundColor = [UIColor clearColor];
    tableViewMenuItems.delegate = self;
    tableViewMenuItems.dataSource = self;
    tableViewMenuItems.scrollEnabled = NO;
    [myview addSubview:tableViewMenuItems];
    [tableViewMenuItems release];
    self.view = myview;
    [myview release];
}

这是选择行的委托方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SendMessageViewController *sendMessageViewController = [[SendMessageViewController alloc] init];
    [self.navigationController pushViewController:sendMessageViewController animated:YES];
    [sendMessageViewController release];
}

我的bt

#0  0x94e3c9c6 in __pthread_kill ()
#1  0x98079f78 in pthread_kill ()
#2  0x9806abdd in abort ()
#3  0x9588a921 in abort_message ()
#4  0x958881bc in default_terminate ()
#5  0x010ee23b in _objc_terminate ()
#6  0x958881fe in safe_handler_caller ()
#7  0x95888268 in std::terminate ()
#8  0x958892a0 in __cxa_throw ()
#9  0x010ee416 in objc_exception_throw ()
#10 0x00f9c0bb in -[NSObject(NSObject) doesNotRecognizeSelector:] ()
#11 0x00f0b966 in ___forwarding___ ()
#12 0x00f0b522 in __forwarding_prep_0___ ()
#13 0x0008c870 in -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] ()
#14 0x00082b05 in -[UITableView _userSelectRowAtPendingSelectionIndexPath:] ()
#15 0x0079c79e in __NSFireDelayedPerform ()
#16 0x00f7b8c3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#17 0x00f7ce74 in __CFRunLoopDoTimer ()
#18 0x00ed92c9 in __CFRunLoopRun ()
#19 0x00ed8840 in CFRunLoopRunSpecific ()
#20 0x00ed8761 in CFRunLoopRunInMode ()
#21 0x011d21c4 in GSEventRunModal ()
#22 0x011d2289 in GSEventRun ()
#23 0x00023c93 in UIApplicationMain ()
#24 0x00002589 in main (argc=1, argv=0xbffff698) at main.m:14

我做错了什么?

3 个答案:

答案 0 :(得分:2)

看看这一行

-[NSObject(NSObject) doesNotRecognizeSelector:] ()

它清楚地表明,当您单击表格视图单元格时,您正在调用代码中某处不存在的方法。尝试在SendMessageViewController

的viewDidLoad和viewWill / DidAppear方法中搜索警告

答案 1 :(得分:1)

好的发现了我的问题:

我的代表正在这样做

MenuViewController *menuViewController = [[[MenuViewController alloc] init] autorelease];
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:menuViewController] autorelease];

所以最后我在释放的对象上调用方法。所以我删除了自动释放,问题解决了。感谢所有回复的人

答案 2 :(得分:0)

确保您正在调用UIViewController的指定初始化程序;因为你没有使用笔尖,所以你应该打电话:

[[SendMessageViewController alloc] initWithNibName: nil bundle: nil];

或者,您只需在视图控制器的init方法中调用此方法即可。

如果这不能解决问题,请在NSException上设置符号断点,以使代码在问题点停止,并希望为您提供更多信息。

顺便说一下 - 为什么要创建一个容器视图屏幕大小的任何特定原因?你将免费获得一个设置。您应该只能将UITableView添加为视图控制器视图的子视图,这有助于简化代码。或者只使用UITableViewController。