将新行添加到uiTableView

时间:2012-11-19 01:17:51

标签: ios

我正在尝试向UITableView添加新行。用户在UITextField的{​​{1}}中输入数据,然后控件返回原始UIViewController。添加新行时,哪种方法写入表。我似乎已经尝试了一切。似乎没什么用。

以下评论中的代码是:

UITableView

2 个答案:

答案 0 :(得分:2)

如果要将新行数据存储在由UITableView访问的数组中(例如),则只需按以下方式重新加载表:

[self.tableview reloadData];

答案 1 :(得分:1)

我已将您在评论中提供的代码更新为另一个答案。

最重要的是,您没有告诉我们您的异常在哪里生成,也没有告诉我们异常是什么。如果您希望我们提供帮助,您需要缩小范围。此外,我不确定从您建议在输入UITextField并且您返回到之前的控制器之后导致异常的事实得出结论,但您没有向我们展示该代码,而是你向我们展示了代替AddItemViewController的代码。您是否在第一次发生错误时或者当您尝试弹出/关闭以使用UITableView返回视图控制器时收到错误?

尽管有这些相当重要的问题,我还是建议两件事:

首先,请确保添加对结果的可靠检查,以防止发生异常。例如,常见问题是从属性或{{1}检索值但是由于某种原因,它不是代码所假设的对象类型(并且要求它)。在这种情况下,您假设NSArraydestinationViewController,而且,您假设其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来验证这些假设。

现在,我没有理由知道NSAssertnav的值是否是您的问题,但这是您的代码应该检查的一种示例。这只是一个很好的做法(特别是如果您正在努力寻找异常),以确保您检索到的对象是正确的类型,代码的其余部分依赖于该类型。

我有别的动机。您的代码暗示您正在导航到视图控制器,该视图控制器本身嵌入在自己的导航控制器中。你从未在叙述中说过多少,所以这些aivc陈述只是验证了这一事实。

其次,如果您对对象的所有强大验证都没有发现问题,那么您必须自己确定异常的来源。通常可以通过查看堆栈跟踪来解析这个问题。 “调试导航器”或通过在Xcode中的控制台中读取错误。但是,另一个(未被充分认识的,恕我直言)工具是exception breakpoints,它可以找到导致异常的确切代码行。如果我遇到任何异常,我会定期在“All”异常上添加一个异常断点。这样,如果我通过我的调试器运行程序,如果它遇到异常,它将停止违规行的代码,大大简化了识别问题根源的过程。它并不总是完美地工作,但它经常比其他技术更快地找到异常的来源。

exception breakpoint