如何定义登录/注册和主控制器工作流程?

时间:2014-04-16 01:30:19

标签: ios ruby rubymotion

我有一个带登录/注册屏幕和主控制器的基本应用程序,一旦用户登录就会显示。此外,当通过URL打开应用程序时,我想显示一个模态控制器。

我已经尝试了几种关于如何做到这一点的模式并且已经确定了下面的模式。然而,它有效,我觉得应该有一个比我在下面做的更好的方法。以下问题是,当通过URL打开应用程序时,它不会打开模态控制器

这就是我正在做的事情

class AppDelegate
  attr_reader :window
  include AFNetworkingClient

  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    if AppHelper.user_set?
      initAFNetworkingClient
      Color.fetch(AFMotion::Client) do |data|
        main_controller = ColorController.alloc.initWithData(data)
        @window.rootViewController = UINavigationController.alloc.initWithRootViewController(main_controller)
      end
    else
      main_controller = WelcomeController.alloc.initWithNibName(nil, bundle: nil)
      @window.rootViewController = UINavigationController.alloc.initWithRootViewController(main_controller)
    end
    @window.makeKeyAndVisible
    true
  end

  # This doesn't show the modal controller for some reason
  def application(application, openURL:url, sourceApplication:sourceApp, annotation:annotation)
    Color.fetch(AFMotion::Client) do |data|
      main_controller = ColorController.alloc.initWithData(data)
      ctlr = UINavigationController.alloc.initWithRootViewController(self.add_color_controller)
      ctlr.modalTransitionStyle = UIModalTransitionStyleCoverVertical
      ctlr.delegate = self
      self.presentViewController(ctlr, animated:true, completion:nil)
    end
  end
  def add_color_controller
    @add_color_controller ||= MyModalController.new.tap do |ctlr|
        ctlr.navigationItem.leftBarButtonItem = UIBarButtonItem.alloc.initWithBarButtonSystemItem(
            UIBarButtonSystemItemCancel,
            target: self,
            action: :cancel)

        ctlr.navigationItem.rightBarButtonItem = UIBarButtonItem.alloc.initWithBarButtonSystemItem(
            UIBarButtonSystemItemDone,
            target: self,
            action: :done)

        ctlr.navigationItem.rightBarButtonItem.enabled = false
    end
  end

  def cancel
    self.dismissViewControllerAnimated(true, completion:nil)
  end
end

WelcomeController的一部分

class WelcomeController < UIViewController
  include AFNetworkingClient
  def viewDidLoad
    super

    rmq.stylesheet = WelcomeControllerStylesheet
    rmq(self.view).apply_style :root_view

    display_login unless AppHelper.user_set?

  end
  def display_login
    @login = LoginController.alloc.init
    @login.delegate = self
    self.presentViewController(@login, animated:false, completion:nil)
  end
....
end

问题

  • 有没有更好的方法来管理我上面提到的工作流程?
  • 如何修复上述代码,以便当我使用网址打开应用时,它不会抛出错误:Application windows are expected to have a root view controller at the end of application launch

1 个答案:

答案 0 :(得分:0)

缺少的是在Color.fetch运行时显示的控制器。因此,方法返回并且@window.rootViewController尚未设置为任何内容,直到调用Color.fetch中的块为止。这也是presentViewController(..)遇到麻烦的原因 - 没有控制器可以进行演示!

所以第一次迭代就是拥有一个“加载”视图控制器。这不是伟大的用户体验,但是......接下来我会修改ColorController以存储Color.fetch的最后结果并显示,然后当新数据进入时更新UI。我认为,更多的工作,但更好的用户体验。当没有缓存数据时,它可以有自己的“加载”屏幕,或者它可以将LoadingViewController呈现为模态,就像那样。

这也涉及移动Color.fetch的{​​{1}}代码OUT,我强烈敦促(关注点分离)。我认为控制器应该负责加载自己的数据。