Swift:重新加载视图控制器

Posted

技术标签:

【中文标题】Swift:重新加载视图控制器【英文标题】:Swift: Reload a View Controller 【发布时间】:2015-09-21 08:28:21 【问题描述】:

点击某个按钮时,我需要刷新view controller。简单地激活viewDidLoad() 似乎并不能满足我的需要。但是,当我离开 view controller 然后再回来时,它似乎工作得很好?

如何刷新/重新加载view controller,就好像我已经离开它然后又回到它而不实际离开它?

【问题讨论】:

你到底想刷新什么? 你找到解决办法了吗? 这个问题与我回答的另一个问题相似。请在此处查看我的回复:updating a view controller with new data 【参考方案1】:

斯威夫特 5.2

only 我发现在按钮可见性发生变化的情况下动态刷新视图的方法是:-

viewWillAppear(true)

这可能是一种不好的做法,但希望有人会发表评论。

【讨论】:

【参考方案2】:

如果您需要在某些更改后通过重绘视图来更新画布,则应调用 setNeedsDisplay。

感谢@Vincent 之前的评论。

【讨论】:

【参考方案3】:

View Life Cycle

每次打开视图时它都会加载ViewWillAppear。上面是图片View Controller Lifecycle的链接。

viewWillAppear()——在视图控制器的内容视图被添加到应用程序的视图层次结构之前调用。使用此方法触发在内容视图显示在屏幕上之前需要发生的任何操作。尽管有这个名字,只是因为系统调用了这个方法,它并不能保证内容视图会变得可见。该视图可能被其他视图遮挡或隐藏。这个方法只是表明内容视图即将被添加到应用程序的视图层次结构中。

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiosAppsSwift/WorkWithViewControllers.html

【讨论】:

【参考方案4】:

如果您使用的是导航控制器,您可以再次选择当前的 UIViewController,它会被刷新。

【讨论】:

这是在视图控制器内的按钮点击上强制刷新视图控制器的正确答案。 迄今为止最好的答案!【参考方案5】:

无论您在viewDidLoad 中编写什么代码,都将其添加到viewWillappear()。这将解决您的问题。

【讨论】:

仅当您离开视图控制器并返回到它时。但是如果你想在点击按钮时刷新视图控制器,这是行不通的。 此外,每次显示视图时都会重新加载数据,即使没有必要。 取决于您的导航层次结构。如果您关闭非全屏模式,将不会调用 willWillAppear。【参考方案6】:

在 Swift 4 中:

self.view.layoutIfNeeded()

【讨论】:

【参考方案7】:

这可能有点晚了,但你有没有试过打电话给loadView()

【讨论】:

public func loadView() // 如果不使用 nib,子类应该在此处创建自定义视图层次结构。 永远不应直接调用。 moreHere 我不认为他是说直接调用它。他说要在那里添加代码。【参考方案8】:

你不应该手动调用 viewDidLoad 方法, 相反,如果你想重新加载任何数据或任何 UI,你可以使用这个:

override func viewDidLoad() 
    super.viewDidLoad();

    let myButton = UIButton()

    // When user touch myButton, we're going to call loadData method
    myButton.addTarget(self, action: #selector(self.loadData), forControlEvents: .TouchUpInside)

    // Load the data
    self.loadData();


func loadData() 
    // code to load data from network, and refresh the interface
    tableView.reloadData()

每当你想重新加载数据并刷新界面时,都可以调用self.loadData()

【讨论】:

这部分实际刷新界面部分是怎么做的? 当你想重新加载时,再次调用loadData从模型中获取数据。在 tableView 调用 reloadData() 或常规视图 setNeedsDisplay。 // 如果子类不使用 nib,则应在此处创建自定义视图层次结构。永远不应该直接调用。

以上是关于Swift:重新加载视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何重新加载 UIPageViewController 以在 Swift 中重新加载其视图

如何重新加载UIPageViewController以在Swift中重新加载其视图

Swift 5 - 用户第二次单击标签栏按钮后,需要帮助在视图控制器 1 上重新加载 Web 视图

swift:重新加载视图以在图表中显示新数据

集合视图不会重新加载(Swift)

如何在 swift 中重新加载 UICollectionReusableView 中的集合视图