Iphone iOS-如何删除应用程序窗口层次结构中的所有ViewController?

Iphone iOS-如何删除应用程序窗口层次结构中的所有ViewController?,iphone,ios,objective-c,xamarin.ios,Iphone,Ios,Objective C,Xamarin.ios,我的应用程序使用典型的身份验证场景,用户使用其凭据登录服务器,服务器返回身份验证令牌,然后将其存储在客户端(iPhone)本地 现在不太可能,但随着时间的推移,存储的身份验证令牌可能会变得无效。由于使用该无效令牌发出的每个请求都会失败,因此我希望在第一次失败时通过将用户“注销”应用程序来处理该问题。注意:该请求可能在后台线程中发出,因为应用程序正在定期与服务器同步 注销意味着: 删除本地存储的令牌 删除用户存储的所有其他内容(在Sqlite中) “重定向”用户到登录控制器 因此,用户可能正在查看

我的应用程序使用典型的身份验证场景,用户使用其凭据登录服务器,服务器返回身份验证令牌,然后将其存储在客户端(iPhone)本地

现在不太可能,但随着时间的推移,存储的身份验证令牌可能会变得无效。由于使用该无效令牌发出的每个请求都会失败,因此我希望在第一次失败时通过将用户“注销”应用程序来处理该问题。注意:该请求可能在后台线程中发出,因为应用程序正在定期与服务器同步

注销意味着:

  • 删除本地存储的令牌
  • 删除用户存储的所有其他内容(在Sqlite中)
  • “重定向”用户到登录控制器
  • 因此,用户可能正在查看应用程序中的某些内容,而令牌无效,注销过程开始

    当所有内容都被删除(#2)时,向她展示登录控制器是不够的,因为在登录并解除该控制器后,以前的内容实际上已经不存在了

    为了防止这些副作用,我想完全删除层次结构中的所有视图控制器,无论触发注销时视图控制器有多深

    所以我的问题是:


    在显示登录控制器之前,“杀死”所有活动控制器的最佳方法是什么?

    将您的LoginViewController分配给窗口的
    rootViewController
    。下面是文档中对rootViewController的描述。这听起来和你想要完成的事情一模一样

    根视图控制器提供窗口的内容视图。将视图控制器指定给此属性(以编程方式或使用Interface Builder)会将视图控制器的视图安装为窗口的内容视图。如果窗口具有现有视图层次结构,则在安装新视图之前将删除旧视图


    您的意思是类似于
    [self.navigationController poptrootviewcontrolleranimated:YES]?是,但可能存在嵌套的导航控制器。
    poptroot…
    返回堆栈中的第一个。如果不在其他地方使用,所有其他的都会被释放。啊。。。。我已经这样做了,但是有一些副作用,因为我认为没有在主UI线程上这样做。无论如何谢谢你!没错。您需要更新主线程上的视图控制器。要做到这一点,只需使用dispatch_async并传入主线程和需要完成的工作的调度队列。