我有一个带登录/注册屏幕和主控制器的基本应用程序,一旦用户登录就会显示。此外,当通过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
答案 0 :(得分:0)
缺少的是在Color.fetch
运行时显示的控制器。因此,方法返回并且@window.rootViewController
尚未设置为任何内容,直到调用Color.fetch中的块为止。这也是presentViewController(..)
遇到麻烦的原因 - 没有控制器可以进行演示!
所以第一次迭代就是拥有一个“加载”视图控制器。这不是伟大的用户体验,但是......接下来我会修改ColorController以存储Color.fetch
的最后结果并显示,然后当新数据进入时更新UI。我认为,更多的工作,但更好的用户体验。当没有缓存数据时,它可以有自己的“加载”屏幕,或者它可以将LoadingViewController呈现为模态,就像那样。
这也涉及移动Color.fetch
的{{1}}代码OUT,我强烈敦促(关注点分离)。我认为控制器应该负责加载自己的数据。