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