2014-04-16 2 views
1

У меня есть базовое приложение с экраном входа/регистрации и основным контроллером, который отображается после входа пользователя в систему. Кроме того, когда приложение открывается через 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 

Вопрос

  • Есть ли лучший способ управлять рабочим процессом, о котором я упоминал выше?
  • Как я могу исправить код выше, так что, когда я открываю приложение с URL он не бросает ошибку: Application windows are expected to have a root view controller at the end of application launch

ответ

0

Дело в том, что отсутствует является контроллером, который отображает в то время как Color.fetch работает. Таким образом, метод возвращается, и @window.rootViewController не был настроен ни на что, пока не вызывается блок внутри Color.fetch. Вот почему у presentViewController(..) есть проблемы - нет контроллера, чтобы делать презентацию!

Итак, первая итерация должна состоять в том, чтобы иметь контроллер загрузки. Это не отличный пользовательский интерфейс, хотя ... следующий я бы изменил ColorController, чтобы сохранить последний результат Color.fetch и отобразить это, а затем, когда новые данные приходят в обновлении пользовательского интерфейса. Мне кажется, немного больше работы, но лучше UX. И когда нет кэшированных данных, у него может быть свой собственный экран загрузки, или он может представлять LoadViewController как модальный, что-то вроде этого.

Это также связано с перемещением кода Color.fetch OUT AppDelegate, который я настоятельно призываю в любом случае (разделение проблем). Я думаю, что контроллеры должны нести ответственность за загрузку собственных данных.

 Смежные вопросы

  • Нет связанных вопросов^_^