每次出现视图时更改我的tableview数据源。我应该在哪里做?

时间:2015-10-29 05:21:51

标签: ios swift uitableview

我在UITableViewController的开头声明了一个数组:

class ArchiveTableViewController: UITableViewController {

    var dataSource: [[Book]]!
    (…)

然后我有一个函数getDataSource()从数据库更新数组。 我的第一个想法是在viewWillAppear调用它,但似乎表视图在此之前加载,因此它最终与数组不匹配。 我可以从每个表视图方法调用该函数,但这似乎有点愚蠢。那么最佳去处是哪里?每次出现视图时都必须调用它,因此viewDidLoad不会工作,但必须在tableview方法之前调用它,因此viewWillAppear也不会工作。这就像我需要介于两者之间的东西。或者有更好的方法来做我想要的事情吗?

提前致谢,

丹尼尔

编辑:我应该补充一点,dataSource数组由其他数组组成,每个数组代表表视图中的一个部分。我也得到了数组中部分的数量和行数,因此它必须在整个tableview方法中保持不变,否则应用程序会崩溃,它可能会尝试填充不再存在的行,例如。

编辑4:啊,好吧,我明白了!我很抱歉浪费每个人的时间寻找复杂的答案。 我只需从 {em> getDataSource() viewDidLoad致电viewWillAppear,然后致电tableView.reloadData() 仅<{1}}中的

我正在尝试放置内容的所有组合以及viewWillAppearreloadData它有时会被永远重复调用,直到它崩溃...或者其他尝试我会称之为getDataSource() getDataSource()而不是来自viewWillAppear,然后它会在第一次崩溃...无论如何,我错过了最明显的组合,现在我无法理解我之前没有看到它。非常感谢你的时间。

3 个答案:

答案 0 :(得分:2)

将其设置为override func loadView()

编辑:作为一般做法,您应该如何去做:

  1. 在提取表数据时在屏幕上显示加载覆盖。
  2. 数据可用后:

    2.1。删除加载覆盖。

    2.2。更新数据源模型。

    2.3。重新加载您的表视图,以便选择最新的模型。

答案 1 :(得分:1)

您是否正在显示其他视图控制器,然后返回到使用tableView的视图控制器,以及为什么每次视图出现时都要更新tableView?

如果是这样 - 它应该按照您最初尝试的方式工作,如果您将getDataSource放在viewWillAppear()中并且它最后调用tableView.reloadData()(就像您在源示例中所拥有的那样)然后它将有效地显示您为它准备的内容(所有tableview方法将在reloadData()之后再次调用,即使它们之前已被调用过)。

因此,当您从viewWillAppear()调用它时,我会建议调试它无法正常工作的原因。 请使用此方法添加一些屏幕截图或其他不正确的数据。

作为旁注,如果getDataSource()花费大量时间,如果您将视图控制器放入viewWillAppear,则可能会延迟显示您的视图控制器。在这种情况下,您需要按照@Abhinav为您的方式进行操作(但您可以从viewWillAppear开始)。

更新:您是对的,具体取决于您撰写numberOfSectionsInTableView()tableView(_, numberOfRowsInSection)的方式,您可能还需要致电getDataSource()来自viewDidLoad(),否则您可能会崩溃,因为您没有处理空数据集。 在这种情况下,您不需要tableView.reloadData(),因为无论如何都会调用表格查看方法,因此,如您所述,将其与getDataSource()分开是很好的。

关于getDataSource()重复调用直到崩溃 - 可能发生在getDataSource()方法之一(UITableViewDataSource)中添加numberOfSectionsInTableView()因为reloadData()getDataSource() {1}}会再次触发此方法。

答案 2 :(得分:0)

每个函数都需要访问var dataSource。所以调用getDataSource必须去的地方:你创建一个包含dataSource或nil的可选变量,然后你给dataSource一个getter,如果不是nil则返回解包的可选变量,否则调用getDataSource。