我正在开发一个使用标签栏选择了多个视图的应用。一个选项卡使用表视图显示数据列表。另一个选项卡使用表格视图(和导航控制器),因此用户可以从列表中添加项目/删除项目。
如果用户在添加或删除其他选项卡上的项目后切换到第一个选项卡,则应用程序崩溃。 (我仍在尝试从调试器输出中收集任何有用的东西)。
新(截至8月22日)信息:
根据下面的一些评论,我一直在做一些探索,我认为我不能正确分配对象。下面是一个堆栈跟踪,但请注意我并不总是得到相同的错误。例如,有时我得到一个未被捕获的异常,有时只是调试器步骤;当它是未被捕获的例外时,它并不总是相同的。
2009-08-22 15:20:34.254墨西哥[29531:20b] * - [_ NSIndexPathUniqueTreeNode isEqualToString:]:无法识别的选择器发送到实例0x562ff0 2009-08-22 15:20:34.255墨西哥[29531:20b] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'*** - [_ NSIndexPathUniqueTreeNode isEqualToString:]:无法识别的选择器发送到实例0x562ff0 “ 2009-08-22 15:20:34.257墨西哥[29531:20b] Stack:(
2504683691, 2423127611, 2504712874, 2504706220, 2504706418, 817812590, 19892, 816386359, 816387412, 816468754, 816411067, 836579268, 836579060, 836577406, 836576671, 2504177986, 2504184740, 2504187000, 827745792, 827745989, 816114848, 816160924 )
[Session started at 2009-08-22 15:20:34 -0400.] Loading program into debugger… GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-apple-darwin".warning: Unable to read symbols for "/System/Library/Frameworks/UIKit.framework/UIKit" (file not found). warning: Unable to read symbols from "UIKit" (not yet mapped into memory). warning: Unable to read symbols for "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics" (file not found). warning: Unable to read symbols from "CoreGraphics" (not yet mapped into memory). Program loaded. sharedlibrary apply-load-rules all Attaching to program: `/Users/matt/Library/Application Support/iPhone Simulator/User/Applications/0F9033CE-39BB-4589-B791-5E473D991789/Mexico.app/Mexico', process 29531. (gdb) bt
#0 0x954a6f54 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ () #1 0x906dfe3b in objc_exception_throw () #2 0x9542da53 in CFRunLoopRunSpecific () #3 0x9542dc78 in CFRunLoopRunInMode () #4 0x31566600 in GSEventRunModal () #5 0x315666c5 in GSEventRun () #6 0x30a4eca0 in -[UIApplication _run] () #7 0x30a5a09c in UIApplicationMain () #8 0x00001ffc in main (argc=1, argv=0xbfffe108) at /Users/matt/Coding/iPhone/Mexico/main.m:13 (gdb)
这是一些(我认为)相关代码。首先,调用视图添加新条目的函数:
- (IBAction)addButtonWasPressed {
AddPlayerViewController *apvController;
apvController = [[AddPlayerViewController alloc]
initWithNibName:@"AddPlayerView" bundle:nil];
apvController.rvController = self;
[self.navigationController pushViewController:apvController animated:YES];
[apvController release];
}
然后在添加播放器视图中:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[rvController addPlayerNamed:textField.text];
[textField resignFirstResponder];
[self.navigationController popViewControllerAnimated:YES];
return YES;
}
最后RosterViewController
是UITableViewController
的子类,并具有以下方法:
- (void)addPlayerNamed:(NSString *)name {
Player *player = [[Player alloc] initWithName:name];
[players addObject:player];
// insert NSLogS
NSIndexPath *indexPath;
indexPath = [NSIndexPath indexPathForRow:[players indexOfObject:player] inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:NO];
}
如果我遍历玩家并使用NSLog语句打印出名称(请参阅上面的评论点),那么在我添加第二个条目后应用程序崩溃了。如果我取出NSLog语句,那么它将在以后崩溃。
答案 0 :(得分:1)
如果我不得不猜测,我会说你可能在你的两个表视图中共享数据对象(数据源),而从一个中删除正在影响另一个,并且你试图在另一个中对已发布的对象做一些事情导致应用程序崩溃的视图,或沿着这些行的某些内容。
答案 1 :(得分:1)
我是这样做的:
创建一个实现UITableViewDataStore
委托方法的类。将其分配给两个viewcontrollers都可访问的内容。在UIApplication级别上有一个好地方,所以你可以通过以下方式获得它:
MyDataStore * store =((MyApplication *)[UIApplication sharedApplication])。{myDataStore}
对于后备存储,此类会将实际值保存在数组,字典,SQLite数据库或类似内容中。
将此类分配给每个表的dataSource
属性。由于它由应用程序拥有,因此在应用程序完成之前不应该发布它。因此,您需要确保通过具有“retain”属性的属性访问该对象。
每次用户添加您要将其添加到此对象的内容时,请在表格上调用reloadData
以刷新该表。
对于每个视图,实现viewWillAppear
方法。只要该视图进入视图,就会调用此方法。在里面它也会调用表reloadData
。这样,当用户从一个视图切换到另一个视图时,在显示新视图之前,它将使用新数据刷新自己。
如果您将数据存储区对象分配给应用程序,那么它在应用程序的生命周期内拥有它,因此您可能不希望将其设置为autorelease
。如果内存成为问题,那么您需要将支持内容保存到SQLite或CoreData。
您可能已经在做这一切,但这是在视图之间创建共享数据的一般模式。也许它会帮助慢跑。