当 UIViewController 回到顶部时,iOS 中是不是有委托函数来获得通知?

Posted

技术标签:

【中文标题】当 UIViewController 回到顶部时,iOS 中是不是有委托函数来获得通知?【英文标题】:Is there a delegate function in iOS to get notified when a UIViewController is coming back to top?当 UIViewController 回到顶部时,iOS 中是否有委托函数来获得通知? 【发布时间】:2019-04-18 18:52:09 【问题描述】:

我有点 Swift/ios 新手,但这看起来很简单。我有一个 UIViewController 并且在某些操作后我正在实例化另一个模态 UIViewController,在某些时候我会关闭它。我只需要在发生这种情况时通知发起 VC。意识到这可以使用导航控制来处理,我正在寻找一种方式来完成它,即

我想将模态 vc 推送到层次结构:

let vc = storyboard.instantiateViewController(withIdentifier: "DetailView")
self.present(vc, animated: true, completion: nil)

当我在模态 vc 中执行此操作时:

dismiss(animated: true, completion: nil)

我只想让位于后台的原始 vc 得到通知,它重新回到焦点(或顶部)并能够执行代码。

我错过了什么?

【问题讨论】:

viewWillAppear. @rmaddy 我对 viewWillAppear 的理解是它只通知一个视图即将添加到视图层次结构中。在这种情况下,我的视图不是已经在层次结构中了吗,只是坐在堆栈中的一个吗? 它再次出现时也会被调用(大多数情况下)。 @rmaddy 我想这一定是其中一种情况。 viewWillAppear 不会被调用 - 至少,如果我正确实施的话。只需添加一个覆盖函数,当模态 vc 关闭时它不会执行。嗯 模态框是否在弹出框中?这就是其中一种情况。 【参考方案1】:

已更新:这里的答案很简单。以“Over Current Context”呈现样式以模态方式呈现的 ViewController 在被解散时不会在呈现的 VC 中触发 ViewWillAppear。下面的答案作为一个黑客工作得很好,但更简单的解决方案是我正在寻找的。即,将演示样式更改为全屏。


所以我最终实现了一个紧凑的解决方案——有些人会说没有协议就不是 OOP,我同意——但在这个应用程序的范围内,它在简单的呈现/解除构造的上下文中解决了问题。

在演示的vc中,我添加了这段代码。

let vc = storyboard.instantiateViewController(withIdentifier: "DetailView") as! DetailViewController
vc.masterVC = self
self.present(vc, animated: true, completion: nil)

在模式关闭时调用的 masterVC 中声明的函数,即:

func calledWhenModalDismisses() 
   // Do This

在弹出的modal DetailView中,我只是创建了一个指向master的成员:

var masterVC: MasterViewController?

然后在我的详细解除函数中,我可以回调我在 MasterVC 中创建的函数。

masterVC?.calledWhenModalDismisses()
dismiss(animated: true, completion: nil)

再次重申,这不是一个真正的 OOP 解决方案(没有协议),但我相信这将有助于某人通过简单紧凑的解决方案来解决简单的主/详细问题,当呈现的 vc 需要在详细 vc 正在被提醒时被解雇。当 vc 进入“焦点”时,Apple 实际上应该有一个委托函数来处理这个问题,但他们没有。

【讨论】:

以上是关于当 UIViewController 回到顶部时,iOS 中是不是有委托函数来获得通知?的主要内容,如果未能解决你的问题,请参考以下文章

js练习总结

回到顶部bug

JS实现回到Top(顶部)--JavaScript

将 swift storyboard 上的所有控件从屏幕顶部向下拖动,但运行时它们又回到屏幕顶部

关于angular跳转路由之后不能自动回到顶部的解决方法

点击回到顶部的按钮