【问题标题】:Variating view controller based on global variable基于全局变量的变化视图控制器
【发布时间】:2013-04-16 13:21:25
【问题描述】:

我目前正在开发涉及签名过程的应用程序。它是标签栏应用程序,但为简单起见,我将使用只有 2 个标签的示例。主页和设置。

在家里,用户会看到他的主屏幕,上面有各种照片和最后的消息。 但是,当用户未登录时,默认为匿名视图。

我的问题是,你们如何使用一个视图控制器和两个不同的复杂视图。启动应用程序后,主页视图控制器是默认的。我正在使用故事板,所以只有一个视图控制器可以是 HomeViewController。(显然:))

我知道在一个视图控制器上执行多个 UIView 并基于全局变量 (NSUserDefaults) 隐藏/显示这些视图的可能性。问题是,这两种观点都有很多出路。 (滚动视图、表格视图等)。因此,一方面,在 UIView 上对所有这些插座进行编程将是硬核,并且会有很多冗余。 (登录用户会登录,但所有 UIView 的数据 - 包括未注册用户的视图都必须下载)。

根据用户是否登录,创建两个视图控制器并显示一个会更容易。(只需检查 appdelegate 的 applicationdidfinishloading 中的 NSUserDefaults 字典)

【问题讨论】:

    标签: iphone ios uiviewcontroller uitabbarcontroller


    【解决方案1】:

    您可以实现HomeViewController 是一个控制许多视图控制器的控制器。与UINavigationControllerUITabViewController 控制许多viewControllers 的方式相同,其中viewController 是可见的。

    你的 HomeViewController 看起来像这样:

    @interface HomeViewController : UIViewController
    
    @property (strong, nonatomic) UIViewController *authenticatedVC;
    @property (strong, nonatomic) UIViewController *anonymousVC;
    
    - (void)showAuthenticatedView;
    - (void)showAnonymousView;
    
    @end
    
    @implementation HomeViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // init your VCs
        self.authenticatedVC = [[UIViewController alloc] init];
        self.anonymousVC = [[UIViewController alloc] init];
    
        // show your initial VC (assuming anonymousView is you default)
        [self.view addSubview:self.authenticatedVC.view];
    }
    
    - (void)showAuthenticatedView
    {
        // remove current view
        [self.authenticatedVC.view removeFromSuperView];
    
        // display authenticatedView
        [self.view addSubview:self.authenticatedVC.view];
    }
    
    - (void)showAnonymousView
    {
        // remove current view
        [self.authenticatedVC.view removeFromSuperView];
    
        // display showAnonymousView
        [self.view addSubview:self.anonymousVC.view];
    }
    
    @end
    

    ** 更新: 这是 ios 开发库中关于创建自定义容器视图控制器的链接:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

    【讨论】:

    • 嗯,我第一次听说这个概念... :) 我该怎么做? :) ...我的意思是,是的,我知道我可以在 HomeViewController 的 viewWillAppear 方法中做到这一点(通过呈现另一个控制器),但是导航堆栈(我的所有选项卡中都有导航控制器)会搞砸.但我可能不明白你的意思:)
    • 我已经更新了我的答案。我只是写了代码,从未测试过。
    • 感谢更新 calampunay... 我的 Mac 不在了,所以明天我会测试它。现在投票,看起来不错:)
    • 嘿 calampunay.. 有没有办法用故事板做到这一点?我的意思是我在 auth/anon 视图控制器上有很多出口,我想在故事板环境中“设计”它们,而不是一直编码:) 我试着像你的方式那样做,我在那里创建和命名故事板中的控制器,但是,它们没有连接到导航控制器,所以当我尝试从匿名视图转到另一个控制器时出现异常。我知道使用故事板可能很难做到这一点,这就是我问的原因: )
    • 是的。可以使用情节提要来做到这一点。您可以在故事板中为身份验证和匿名创建视图控制器。您还可以创建自定义转场。 link
    【解决方案2】:

    我会这样做。你有两个 ViewController,一个是 DefaultViewController,另一个是 LoginViewController。检查是否登录,并将rootViewController设置为您要显示的viewController。

    顺便说一句,当您想要存储用户信息(如 id 和密码)时,请使用钥匙串而不是 NSUserDefaults。

    【讨论】:

    • 我实际上是在使用用户/密码进行服务器请求,并将布尔值存储在 NSUserDefaults 的登录键中。密码不会保存在应用程序的任何地方:) 关于那些控制器。这是个好主意,但是是否可以在情节提要中直观地实现它? (我写代码没问题,但我的一些同事更喜欢故事板,因为他们对 obj-c 的了解有限)
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多