2017-07-19 28 views
0

我已经看过这个问题,我找不到答案。展开segue,需要刷新tableview

因此,在我的应用程序的第一页上,我有一个导航控制器中的页面。在那个页面中是一个tableview。在表格的单元格中,有一个按钮。对于单元格的视图控制器,我说如果用户没有登录,则从超级视图中移除按钮。因此,当你第一次加载应用程序时,没有按钮。

现在,如果您单击登录按钮(页面顶部的按钮),它会进入该页面,然后会发生两件可能的事情。起初,我正在做的是让一个segue回到主页面。一切工作都很好。该按钮出现在单元格中。

但我不喜欢如何将主页面的第二个副本添加到导航控制器堆栈。所以我现在探索的是popnavigationcontroller方法和unwind segue。所以他们都工作,但问题是当它展开到新页面时,我之前提到的按钮不会出现在单元格中,即使它应该在用户登录后出现。原因是方法“dequeueReusuableCell”正在使用旧的单元格,其中我删除了该按钮。现在,该按钮被删除,我没有简单的方法将它添加回到视图中的正确位置。

那么这里最好的解决方案是什么?起初,我正在寻找一种方法来“清除”tableView的所有可重用单元,但我不确定是否找到答案。我想做的是当我回到那个导航控制器时,刷新一切,就像有史以来第一次看到它一样。

我想我可以做的另一个解决方案是执行一个正常的从登录页面到主页面,然后删除以前的冗余主导航控制器。有更好的解决方案吗?

+0

不要“删除”单元格中的按钮,只需设置'button.isHidden = true',然后刷新时,可以将isHidden值更改为false –

+0

哇,这很有帮助。该死的我以前看过那个功能,但完全忘了它。非常感谢。 –

回答

1

当您的控制器弹出堆栈时,底层视图控制器将调用其viewDidAppear(animated:)函数。所以,你可以有:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    tableView.reloadData() 
} 

这是基于假设您的文章,这个问题是只有约重装你的表。如果您重新加载表格并且您的单元格仍未正确更新,则说明您的dataSource未正确配置单元格。但是我不知道这是否是没有任何代码的情况。

编辑:这是一个单元重用问题。在某些情况下,单元格配置有一些代码可以删除子视图,但如果它应该在那里,绝不会再添加子视图。最简单的解决方法是使用isHidden而不是直接删除子视图。

+0

我也试过这样做,只是忘了提及它。 我测试了如果通过在任何地方放置打印语句来正确更新单元格,但问题在于,它正在重新使用单元格,其中我已经删除了该按钮。我不想将按钮添加到视图中,因为我不知道如何在代码中执行自动布局等。我已经在故事板中添加了默认按钮。那有意义吗? 当我做一个正常的segue一切正常,因为该按钮不被删除。当单元格第一次加载时,按钮在默认情况下存在。 –

+0

而不是删除按钮,根据您是否需要在按钮上设置'isHidden'为'true'或'false'。你通常有一些功能来配置你的单元格'cellForRowAtIndexPath',是吗?因为细胞被重复使用,所以你总是需要处理你正在做的任何细胞操作的双方。添加/删除子视图,显示/隐藏它们,改变字体/改变它,等等。 – Connor

+0

是的你是对的,我应该使用isHidden。我只是试了一下,一切都很完美。谢谢! 我不知道它是否重要,但如果你把你的答案在自己的另一个线程中,我会标记它正确 –