2016-11-22 64 views
2

我想使用Swift 2.3导航到UIViewController。更确切地说,我正在尝试重新加载目前处于活动状态的UIViewController。我不知道用户当前有哪些视图处于活动状态,因此必须动态定义。导航到Swift 2.3中的UIViewController

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

是这样的可能吗?

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

为刷新目的,你可以打电话viewwillapear和viewDidLoad中方法 –

+0

你不应该自己调用这些方法,因为它可以调用超类方法,这将是意想不到的电话。然而,你可以创建你自己的方法,这些方法可以从viewDidLoad等被调用,当你需要刷新视图时也可以直接调用。 – Paulw11

回答

0

你可以得到这样的:

的Objective-C:

self.navigationController.topViewController.restorationIdentifier 

斯威夫特:

self.navigationController?.topViewController?.restorationIdentifier 
+0

当从我的'BaseUIViewController'类中的函数(从UIViewController继承),'self .navigationController?.topViewController?.restorationIde ntifier'是零 - 是否预期? –

+0

是的,由于某些原因。可能你的视图控制器不是由navigationConroller封装的。您可以打开故事板并找到您的初始视图控制器(左侧的箭头),然后从菜单“编辑器>嵌入>导航控制器”中进行选择,以实现此目的。 – mgyky

+0

我有一个自定义的'UINavigationController',它有一个链接到故事板中最初的'ViewController'。 –

0

我认为你必须与你的架构的一些问题;它不是重载所有可以选择的View Controller上的所有内容的最佳方法;思维

更好的办法是确定的,正是你想要重新加载,并添加方法来重新加载只有这样的东西

无论如何,如果我的回答并没有向你保证,考虑用新的替换现有的视图控制器和什么用一些动画呈现它,或者没有它;所以你一般的算法可能是这样的:

  1. 获得从情节串连图板,或创建新实例新的VC,如果你不喜欢使用它
  2. 推它在你现有的控制器
  3. 刷新栈导航控制器,在其中你现在是
+0

感谢您的回复。我想我真的想重新加载整个'ViewController',但如果我错了,请纠正我。我正在确定互联网连接已经丢失,并且可能已经返回。我正在检查'viewWillAppear()'中的连通性,所以重新加载整个视图看起来就像是要做的事情... –

+0

为什么整个视图? :)可能是你想重新加载所有的标签,我不知道,所有的tableViews?您可以添加方法'重新加载'并将其调用为存在的VC –

0

你可以试试这个

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

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

let activityIdentifierStr = activeViewIdentifier?.restorationIdentifier 

self.performSegueWithIdentifier(activityIdentifierStr!, sender:self) 
+0

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