【问题标题】:Am I presenting my viewControllers correctly?我是否正确展示了我的视图控制器?
【发布时间】:2023-03-11 15:30:01
【问题描述】:

我正在开发一个应用程序,该应用程序要求用户在使用其余服务之前先登录。

此应用由带有 4 个标签栏项目的标签栏控制器组成。所有这 4 个标签栏项都有导航控制器。

现在,我以模态方式展示 loginViewController。我在登录期间实现了“记住我”功能,用户下次重新启动应用程序时会自动登录。为此,我使用 NSUserDefaults 保存指标,并在 viewDidLoad 期间检查用户是否选择了“记住我”并在需要时以模态方式显示 loginViewController。

当用户注销时,我将再次以模态方式显示 loginViewController 并删除 NSUserDefaults。但这会使 tabBarController 的 viewController 的其余部分保持与用户注销之前相同的状态,这意味着当用户再次登录时,它不会是一个新副本。用户登录时如何确保它是新副本?这意味着 textFields 和所有内容不应显示在先前登录期间所做的修改。

总而言之,我想在用户登录时加载 tabBarController viewController 的新副本。

【问题讨论】:

    标签: iphone ios


    【解决方案1】:

    iPhone 是一种“个人”设备。它不是网络浏览器。浏览器是不同的。在 iPhone 上,尽可能避免显式注销,或者让查找注销按钮变得极其困难。 Facebook、Twitter、Foursquare 都这样做。您的手机始终与您同在,注重隐私的用户将设置解锁密码。甚至可以远程擦除丢失的手机(与浏览器不同)。

    在为移动设备开发时考虑移动设备。并非您在网络应用上的所有功能都需要在移动设备上实现。

    话虽如此,如果您仍然需要注销机制,则可以使用 nsnotifications。

    【讨论】:

    • 感谢您的建议,但我不太明白您为什么要“隐藏”注销按钮。如果用户选择退出,让他/她退出并没有什么坏处,不是吗?
    • 没有害处,但没有必要这样做。除非您将手机借给可能会使用您的应用一段时间的人
    • 虽然我同意 iPhone 应该是个人设备,但它们经常落入他人之手,有时是恶作剧之类的人。您肯定已经看到明显不是所有者撰写的 Facebook 帖子(即,“我非常爱我的女朋友!她是世界上最好的女人”等等,等等等等。:) 让用户退出是合理的选项,就像用户选择不退出是一个合理的选项一样。
    • 那么您是否总是退出 iPhone 上的每个应用程序?哈哈。
    【解决方案2】:

    有几种方法可以做到这一点。一种是在注销时发送NSNotification 并让所有需要重新加载其信息的视图观察该通知并进行更新。

    另一种方法是更新viewDidAppear 上每个视图的数据。这种方法的主要缺点是它每次都会更新,无论他们是否退出。

    通知方式如下:

    在注销视图控制器中:

    if (userDidLogout)
    {
       [[NSNotificationCenter defaultCenter] postNotificationName: USER_LOGOUT_NOTIFICATION];
    }
    

    在需要知道的视图控制器中:

    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateMyData:) name: USER_LOGOUT_NOTIFICATION object: nil]
    
    //...
    
    - (void) updateMyData: (NSNotification*) note
    {
        // ...
    }
    

    【讨论】:

    • 这很好用,只是我在用户登录时阻止了该事件。当用户注销时显示更改会很奇怪。
    【解决方案3】:

    按下logout 按钮时,请确保取消分配所有活动视图。当您重新登录时,创建一个分配一组新的视图。

    您可以使用NSUserDefaultsloginlogout 进行检查,并且整个过程必须在逻辑上同步。您唯一需要担心的是正确释放所有视图并在您再次登录时适当地删除它们。确保没有内存泄漏,并且您的视图控制器遵循 Apple 针对 Memory Management 的准则。

    【讨论】:

      【解决方案4】:

      我会这样做:

      每次打开选项卡时都会调用 viewWillAppear。您可以在 viewWillAppear 中重新加载视图内容。

      每次用户打开视图时,此解决方案都会重新加载视图。通过保存最后一个用户状态有更好的方法来做到这一点,所以每次用户进入视图时,检查 UserState(即 LoggedIn/LoggedOut)是否匹配,如果没有重新加载视图,则无需重新加载。

      【讨论】:

        猜你喜欢
        • 2014-10-23
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 2017-06-08
        • 2011-04-12
        • 1970-01-01
        相关资源
        最近更新 更多