前段时间我发布了一个类似的问题,但事实证明我选择的解决方案既不可持续也不是一个好的解决方案。所以我再次尝试,采用不同的方法。
这是我的问题
我正在制作一个使用 Facebook 登录并连接到服务器的应用程序。因此,在任何给定时间,用户都必须使用 Facebook 登录,并且 user_id 需要存储在NSUserDefaults
. 如果在应用程序中的任何时候,两者中的任何一个都不存在,我需要将用户引导到登录屏幕。
同样,如果用户手动按下注销,我需要将他/她引导到同一个屏幕。
看到我正在使用SWRevealViewController
,我需要不止一个UINavigationController
. 因此popViewController
不起作用。
这是我的应用程序设置
是initialViewController
一个UINavigationController
,指向另一个ViewController
。在这里,我检查用户是否已登录 Facebook,并且 user_id 是否存储在NSUserDefaults
. 如果是,我将他们定向到SWRevealViewController
. 如果不是,我将它们定向到LoginViewController
(我使用performSegueWithIdentifier:
)。在LoginViewController
用户成功登录 Facebook 和我的服务器后,我将他们定向到相同的SWRevealViewController
.
基本上,SWRevealViewController
分为两部分:Asw_front
和 a sw_rear
(菜单)。每一个都需要他们自己的UINavigationController
(据我所知,没有它我就无法工作)。
从这里开始,该应用程序分成几个不同的ViewControllers
.
您可以在此图像中看到故事板:( 此处链接到完整分辨率图像) (注销按钮是顶部的蓝色按钮,登录按钮是开始时的蓝色按钮)
这是我尝试过的:
上次我问了一个类似的问题时,我选择了一个解决方案,我在用户注销时展示InitialNavigationController
使用该功能。presentViewController
这似乎工作正常,并且ViewController
呈现了modally
其他应用程序似乎也可以执行的新功能(请参阅linkedIn 等)。
但是,当我再次登录时,FacebookshowLoggedInUser
方法似乎被调用了两次(我NSLog()
在那里放置了一个语句)。当我重复第三次时,它运行了三次。第四次登录,四次,以此类推。
此外,在第二次注销时,我会在编译器中收到警告说Warning: Attempt to present <UINavigationController: 0x13c566730> on <UINavigationController: 0x13c549c70> whose view is not in the window hierarchy!
. 当我重复登录-注销过程时,此警告也会不断增加。
我想要的是:
据我了解,我一直将其InitialViewController
作为模式视图添加到堆栈中,这不是我想要的。我只是想回到起点。或任何对此事有用的东西。只要我有一个简单的登录/注销系统,我就会很高兴。请记住,如果用户似乎已注销(如果他从 Facebook 注销、Facebook 事件超时NSUserDefaults
或某些原因重置(例如在更新下))。
如果可能的话,我想知道其他应用程序如何实现这一点(例如linkedIn、Facebook、Twitter 或其他任何人)。
我一直在考虑的是添加一个单独的LoginView
未连接到任何东西,每当我看到用户已注销时,我都可以模态加载。每当登录完成时,我只需关闭视图,用户就会返回到他上次所在的位置。
我看到的唯一问题是,当用户注销时,他在技术上仍然“在”应用程序“内部”,尽管他无法在不登录的情况下关闭模态视图控制器。
这对我的问题来说是一个可以忍受的解决方案吗?
你有什么建议?
一些物理代码显示如何呈现新视图/返回(或任何其他解决方案)是首选,但任何帮助表示赞赏!
我知道这是一个很长的问题,可能有很多答案,但我一直坚持这个问题很长时间,我只想要一个适合我的设置的解决方案。所以我觉得有必要解释一切。如果有什么你不明白的,请不要犹豫,问!
非常感谢您!