我正在尝试向UITableView
添加新行。用户在UITextField
的{{1}}中输入数据,然后控件返回原始UIViewController
。添加新行时,哪种方法写入表。我似乎已经尝试了一切。似乎没什么用。
以下评论中的代码是:
UITableView
答案 0 :(得分:2)
如果要将新行数据存储在由UITableView访问的数组中(例如),则只需按以下方式重新加载表:
[self.tableview reloadData];
答案 1 :(得分:1)
我已将您在评论中提供的代码更新为另一个答案。
最重要的是,您没有告诉我们您的异常在哪里生成,也没有告诉我们异常是什么。如果您希望我们提供帮助,您需要缩小范围。此外,我不确定从您建议在输入UITextField
并且您返回到之前的控制器之后导致异常的事实得出结论,但您没有向我们展示该代码,而是你向我们展示了代替AddItemViewController
的代码。您是否在第一次发生错误时或者当您尝试弹出/关闭以使用UITableView
返回视图控制器时收到错误?
尽管有这些相当重要的问题,我还是建议两件事:
首先,请确保添加对结果的可靠检查,以防止发生异常。例如,常见问题是从属性或{{1}检索值但是由于某种原因,它不是代码所假设的对象类型(并且要求它)。在这种情况下,您假设NSArray
是destinationViewController
,而且,您假设其UINavigationController
数组中的第一个元素是viewControllers
。你知道你的代码,也许你对这个事实充满信心,但是你得到异常的事实意味着你可能需要更强大的错误检查。
因此,我建议您包括将验证此事实的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
陈述只是验证了这一事实。
其次,如果您对对象的所有强大验证都没有发现问题,那么您必须自己确定异常的来源。通常可以通过查看堆栈跟踪来解析这个问题。 “调试导航器”或通过在Xcode中的控制台中读取错误。但是,另一个(未被充分认识的,恕我直言)工具是exception breakpoints,它可以找到导致异常的确切代码行。如果我遇到任何异常,我会定期在“All”异常上添加一个异常断点。这样,如果我通过我的调试器运行程序,如果它遇到异常,它将停止违规行的代码,大大简化了识别问题根源的过程。它并不总是完美地工作,但它经常比其他技术更快地找到异常的来源。