在 Swift 2.3 中导航到 UIViewController

Posted

技术标签:

【中文标题】在 Swift 2.3 中导航到 UIViewController【英文标题】:Navigate to UIViewController in Swift 2.3 【发布时间】:2016-11-22 12:22:57 【问题描述】:

我正在尝试使用 Swift 2.3 导航到 UIViewController。更准确地说,我正在尝试重新加载当前处于活动状态的UIViewController。我不知道用户当前激活了哪个视图,所以必须动态定义。

我尝试了几种方法,但它们都会导致编译或运行时错误。

这样的事情可能吗?

let activeViewIdentifier = ??? // Get currently active view identifier as a string
self.performSegueWithIdentifier(activeViewIdentifier, sender:self)

【问题讨论】:

为了刷新,你可以调用 viewwillapear 和 viewdidload 方法 您不应该自己调用这些方法,因为它可能会调用对超类方法的调用,这是出乎意料的。但是,您可以创建自己的方法,这些方法可以从 viewDidLoad 等中调用,同时您也可以在需要刷新视图时直接调用 【参考方案1】:

你可以这样:

目标-C:

self.navigationController.topViewController.restorationIdentifier

斯威夫特:

self.navigationController?.topViewController?.restorationIdentifier

【讨论】:

当从我的 BaseUIViewController 类(继承自 UIViewController)中的函数访问时,self.navigationController?.topViewController?.restorationIde‌​ntifier 为 nil - 这是预期的吗? 是的,出于某些原因。可能您的视图控制器没有被 navigationConroller 封装。您可以打开故事板并找到您的初始 viewController(左侧箭头)并选择它,然后从菜单“编辑器>嵌入>导航控制器”中实现这一点。 我有一个自定义的UINavigationController,它有一个指向故事板中初始ViewController 的链接。 您在应用生命周期中调用 self.navigationController?.topViewController?.restorationIde‌​‌​ntifier 的位置?【参考方案2】:

我认为您的架构存在一些问题;这不是在您可以选择的某些 View Controller 上重新加载所有内容的最佳方法;

更好的思维方式是确定你想要重新加载的确切内容并添加方法以仅重新加载这样的事情

无论如何,如果我的回答不能保证,请考虑用新的视图控制器替换现有的视图控制器,并用一些动画来呈现它,或者没有它;所以你的一般算法可能如下所示:

    如果您不喜欢使用它,请从情节提要中获取新的 VC,或创建新实例 将其推到您现有的控制器上 重新加载您现在所在的导航控制器堆栈

【讨论】:

感谢您的回复。我想我真的很想重新加载整个ViewController,但如果我错了,请纠正我。我是在我确定互联网连接已经丢失并且可能已经恢复的时候这样做的。我正在检查viewWillAppear() 中的连接,所以重新加载整个视图似乎是要做的事情...... 为什么是整个视图? :) 可能你想重新加载你所有的标签,我不知道,所有的 tableViews?您可以添加方法“重新加载”并为现有的 VC 调用它【参考方案3】:

你可以试试这个

let activeViewIdentifier = self.navigationController?.childViewControllers[(self.navigationController?.childViewControllers.count)!-1] 

您可以使用 restoreIdentifier,它位于 Storyboard 标识符的正上方,是一个 UIViewController 属性。

let activityIdentifierStr = activeViewIdentifier?.restorationIdentifier

self.performSegueWithIdentifier(activityIdentifierStr!, sender:self)

【讨论】:

运行时错误:不安全的指针。在 viewWillAppear() 期间访问时,activeViewIdentifier?.restorationIdentifier 为 nil

以上是关于在 Swift 2.3 中导航到 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

从 Swift 2.3 迁移到 Swift 3 错误消息

如何在 swift UI 中单击按钮时从 swift UI 导航到情节提要?

Swift - TableView的协议代理无法正常工作 - 以模态呈现

从 swift 2.3 问题迁移到 swift 3.1

在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图