Ios 是否可以定义一个;“通用”;在故事板中释放segue?

Ios 是否可以定义一个;“通用”;在故事板中释放segue?,ios,swift,xcode,Ios,Swift,Xcode,我是IOS开发的新手,来自Android背景。我正在寻找一种方法,在用户注销后返回到我的原始视图控制器 这篇文章建议我应该使用一个放松段 但是,因为我的应用程序的用户会话可能在任何时候(以及在任何视图控制器期间)过期。这意味着我需要从每个视图控制器到根视图控制器进行一个倒带序列!此外,这还将导致一些重复的代码,因为每个视图控制器都需要一种引用自己唯一的segue ID的方法 最初,我希望将UIViewController子类化,并制作一个CustomViewController,然后我的所有其他

我是IOS开发的新手,来自Android背景。我正在寻找一种方法,在用户注销后返回到我的原始视图控制器

这篇文章建议我应该使用一个放松段

但是,因为我的应用程序的用户会话可能在任何时候(以及在任何视图控制器期间)过期。这意味着我需要从每个视图控制器到根视图控制器进行一个倒带序列!此外,这还将导致一些重复的代码,因为每个视图控制器都需要一种引用自己唯一的segue ID的方法

最初,我希望将
UIViewController
子类化,并制作一个
CustomViewController
,然后我的所有其他
ProfileViewController
子类化


CustomViewController
将提供辅助方法,如
func logOut()
。有没有办法做到这一点,也许可以通过一些通用的展开序列?

您不能使用通用的展开序列。您不能继承ViewController的情节提要属性,包括与
ViewController
关联的序列。但是你不需要一个通用的序列来解决你的问题

您可以拥有一个
BaseViewController
,所有其他视图控制器都将从
BaseViewController
扩展。您可以添加逻辑来验证用户是否仍然登录到
BaseViewController
(我无法为此编写代码,因为我没有看到您的代码库)

如果用户不再登录,则只需调用

class BaseViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //implement your logic to monitor if user is still logged in if user not logged in simply call
        self.logOut()
    }

    func logOut() {
       //each child view controller will override and handle log out condition specifically for that ViewController
    }
}
最后,要加载初始ViewController,您可以简单地说将所有ViewController置于其上。假设您的
initialViewController
是应用程序的
rootViewController
,您只需在BaseViewController中修改逻辑即可

   override func viewDidLoad() {
        super.viewDidLoad()
        //implement your logic to monitor if user is still logged in if user not logged in simply call
        self.logOut()
        UIApplication.shared.keyWindow?.rootViewController?.navigationController?.popToRootViewController(animated: true)
    }
方法问题:

根据您的问题描述,我相信您的初始视图控制器保存在ViewController堆栈中,您只需在注销时释放到该初始ViewController即可

尽管这种方法可行,但它有三个问题

  • 初始ViewController不必要地保留在内存中,而在用户注销之前它不会重新出现,因此,您可以在用户登录后将其清除,并在用户注销后将其恢复

  • 如果用户登录并退出应用程序并重新启动应用程序,应用程序将加载初始视图控制器,但如果用户已经登录,为什么还要再次向他显示初始视图控制器

  • 因为您正在将其他VCs推到初始ViewController上,这也意味着用户可以继续点击后退按钮并返回到初始ViewController,这是没有意义的,因为用户点击后退按钮与用户登录状态有什么关系??不是吗

  • 那么什么是更好的解决方案?

    在应用程序启动时更改应用程序的根视图控制器

    打开AppDelegate并

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       //check if user is logged in
    
       guard let window = UIApplication.shared.keyWindow else {
            return
       }
    
       if (userIsLoggedIn) {
          //load view controller that you wanna show after login lets say Home
          let homeVC = //instantiate view controller from story board
          UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
                window.rootViewController = homeVC
            }, completion: { completed in
                // maybe do something here
            })
       }
       else {
           //load initial controller 
          let initialVC = //instantiate view controller from story board
          UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
                window.rootViewController = initialVC
            }, completion: { completed in
                // maybe do something here
            })
       }
    }
    
    最后,如果用户没有登录,并且最终加载了初始VC,并且一旦用户登录了初始VC,您就可以使用我上面编写的代码来更改根VC

          let initialVC = //instantiate view controller from story board
          UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
                window.rootViewController = initialVC
            }, completion: { completed in
                // maybe do something here
            })
    

    如果要返回登录视图控制器,可以从下一个视图设置该视图的单次回放(退出)。然后使用通知中心从应用程序中的任何位置发布通知。“登录旁边”view观察通知并执行回放过程。

    只有当根ViewController为NavigaitonController且登录控制器与根相同时,此操作才有效。@mohammadalijf:编辑答案并提供更多详细信息:)请wait@mohammadalijf:请看一看我猜旧的
    rootViewController
    不在范围之内死了吗?@AlanSTACK:是的,它应该死,除非你有任何有力的证据。理想情况下,只要你设置了一个新的rootview控制器,旧的rootview控制器deinit就应该被调用,n应该给你最后一次机会清除所有保留的资源,为新的状态做准备。但是当前视图会发生什么呢?假设我有
    LoginVC->ProfileVC->CurrentVC
    如果我启动了从
    ProfileVC到LoginVC的倒带
    CurrentVC
    会发生什么?