我已经使用您在评论中提供的代码更新了您的问题,以获取另一个答案。
最重要的是,您没有告诉我们您的异常是在哪里生成的,也没有告诉我们异常是什么。如果您希望我们提供帮助,您需要缩小范围。另外,我不确定从您建议在UITextField
输入之后导致异常并且您返回到以前的控制器这一事实得出什么结论,但是您没有向我们展示该代码,而是您展示了我们将代码用于 segueing 到AddItemViewController
. 当您第一次进行 segue 时,或者当您尝试弹出/关闭以返回视图控制器时,您是否收到错误UITableView
?
尽管有这些相当重要的问题,我还是建议两件事:
首先,确保您添加了对结果的稳健检查,以防止发生异常。例如,一个常见的问题是从属性或 a 中检索值NSArray
,但出于某种原因,它不是代码假定它是(并且要求它是)的对象类型。在这种情况下,您假设 thedestinationViewController
是 a UINavigationController
,此外,您假设其viewControllers
数组中的第一个元素是 a AddItemViewController
。你知道你的代码,也许你对这个事实很有信心,但是你得到一个异常的事实意味着你可能需要更健壮的错误检查。
因此,我建议您NSAssert
加入能够验证这一事实的声明。以您prepareForSegue
为例,我可能会建议对其进行更改:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"AddSegue"])
{
UINavigationController *nav = segue.destinationViewController;
NSAssert([nav isKindOfClass:[UINavigationController class]], @"destinationViewController is not a UINavigationController");
AddItemViewController *aivc = nav.viewControllers[0];
NSAssert([aivc isKindOfClass:[AddItemViewController class]], @"destinationViewController.viewControllers[0] is not a AddItemViewController");
aivc.TVC = self;
}
}
这些NSAssert
语句是在测试期间测试值的好方法,以确保您返回的对象确实是Class
您认为的对象。这些NSAssert
子句仅用于您在开发期间测试的错误,但绝不应该在生产应用程序中发生。如果您的代码对从方法返回的内容做出隐含假设,您可以NSAssert
在调试应用程序时使用这些假设来验证这些假设。
现在,我没有理由知道 或 的值是否nav
是aivc
您的问题,但这是检查您的代码应该做的一种示例。这只是一个很好的做法(尤其是在您努力寻找异常时),以确保您检索到的对象是正确的类型,其余代码都依赖于该类型。
我在这里别有用心。您的代码意味着您正在导航到一个视图控制器,该控制器本身嵌入在它自己的导航控制器中。你从来没有在你的叙述中说过这么多,所以这些NSAssert
陈述只是验证了这个事实。
其次,如果您对对象的所有稳健验证都没有发现问题,那么您必须自己确定异常的来源。通常,您可以通过查看“调试导航器”中的堆栈跟踪或通过在 Xcode 中读取控制台中的错误来破译这一点。但是,另一个(未被充分认识的,恕我直言)工具是异常断点它可以找到导致异常的确切代码行。如果遇到任何异常,我会定期在“所有”异常上添加异常断点。这样,如果我通过我的调试器运行程序,如果它遇到异常,它将在有问题的行停止代码,大大简化了识别问题根源的过程。它并不总是完美地工作,但它经常比其他技术更快地找到异常的来源。