我在UITableViewController的开头声明了一个数组:
class ArchiveTableViewController: UITableViewController {
var dataSource: [[Book]]!
(…)
然后我有一个函数getDataSource()
从数据库更新数组。
我的第一个想法是在viewWillAppear
调用它,但似乎表视图在此之前加载,因此它最终与数组不匹配。
我可以从每个表视图方法调用该函数,但这似乎有点愚蠢。那么最佳去处是哪里?每次出现视图时都必须调用它,因此viewDidLoad不会工作,但必须在tableview方法之前调用它,因此viewWillAppear也不会工作。这就像我需要介于两者之间的东西。或者有更好的方法来做我想要的事情吗?
提前致谢,
丹尼尔
编辑:我应该补充一点,dataSource数组由其他数组组成,每个数组代表表视图中的一个部分。我也得到了数组中部分的数量和行数,因此它必须在整个tableview方法中保持不变,否则应用程序会崩溃,它可能会尝试填充不再存在的行,例如。
编辑4:啊,好吧,我明白了!我很抱歉浪费每个人的时间寻找复杂的答案。 我只需从 {em> getDataSource()
和 viewDidLoad
致电viewWillAppear
,然后致电tableView.reloadData()
仅<{1}}中的。
我正在尝试放置内容的所有组合以及viewWillAppear
内reloadData
它有时会被永远重复调用,直到它崩溃...或者其他尝试我会称之为getDataSource()
getDataSource()
而不是来自viewWillAppear
,然后它会在第一次崩溃...无论如何,我错过了最明显的组合,现在我无法理解我之前没有看到它。非常感谢你的时间。
答案 0 :(得分:2)
将其设置为override func loadView()
。
编辑:作为一般做法,您应该如何去做:
数据可用后:
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。