2013-12-24 1 views
1

Я использую комбинацию ProMotion, Teacup и MMDrawerController. Когда я загружаю приложение, все работает нормально, но когда я пытаюсь перейти с одного экрана на другой, я получаю сообщение об ошибке с Teacup, потому что супервизор равен нулю. Ошибка Teacup: *** Terminating app due to uncaught exception 'NoMethodError', reason: 'calculations.rb:15:in calculate:': undefined method 'bounds' for nil:NilClass (NoMethodError). Это бросается, потому что view.superview равно null.RubyMotion: проигрывает просмотр после открытия нового экрана

Я новичок, но похоже, что ошибка Teacup - это всего лишь симптом большой проблемы с тем, как я настроил все или, возможно, несовместимость с MMDrawerController.

Итак, приложение загружается, переходит в WeekScreen и на WeekScreen, я добавляю навигационную панель с кнопкой, чтобы вернуться к WeekScreen. Когда я нажимаю эту кнопку, я получаю сообщение об ошибке. (Я упростил код здесь - я действительно не имею приложения на одну страницы с помощью кнопки, чтобы вернуться к тому же экрану)

экранов/root_screen.rb

class RootScreen < MMDrawerController 
    include PM::ScreenModule 

    title 'Schedule' 

    def self.new(args = {}) 
    alloc.init.tap do |root_screen| 
     root_screen.on_create(args) 
    end 
    end 

    def centerViewController=(centerViewController) 
    super 
    self.title = centerViewController.title 
    end 

    def on_create(args={}) 
    super 

    self.leftDrawerViewController = Screen::MenuScreen.new(nav_bar: false) 
    self.rightDrawerViewController = nil 
    self.centerViewController = week_screen 

    leftDrawerButton = MMDrawerBarButtonItem.alloc.initWithTarget self, action:"show_menu:" 
    navigationItem.setLeftBarButtonItem leftDrawerButton, animated:true 
    end 

    def will_appear 
    self.title = centerViewController.title 
    end 

    def show_menu(sender) 
    toggleDrawerSide MMDrawerSideLeft, animated:true, completion: nil 
    end 

    def week_screen 
    @week_screen ||= Screen::WeekScreen.new 
    end 
end 

экраны/week_screen.rb

module Screen 
    class WeekScreen < PM::Screen 

    title '' 
    stylesheet :week_styles 
    include Teacup::TableViewDelegate 

    @@cell_identifier = nil 
    @selected_date = nil 

    def will_appear 
     super 

     # mm_drawerController.title = title 
     view.subviews.each &:removeFromSuperview 

     layout(view, :main_view) do |main_view| 
     week_table 

     subview(UIView, :program_nav) do 
      @week_btn = subview(UIButton.buttonWithType(UIButtonTypeRoundedRect), :week_btn) 
     end 

     @week_btn.when_tapped do 
      open WeekScreen.new(nav_bar: true) 
     end 
     end 
    end 

    # a bunch of table stuff removed here to keep this clean-ish 
    end 
end 

стили/week_styles.rb

Teacup::Stylesheet.new :week_styles do 
    style :main_view, 
    frame: [[0,30], ["100%", "100% - 30]] 

    style :program_nav, 
    frame: [[0, "100% - 78"], ["100%", 78]], 
    backgroundColor: "#f1f2f2".to_color, 
    autoresizingMask: (UIViewAutoresizingFlexibleLeftMargin | 
        UIViewAutoresizingFlexibleRightMargin | 
        UIViewAutoresizingFlexibleTopMargin) 

    style :week_btn, 
    center_x: '50%', 
    center_y: '50%', 
    width: 36, 
    height: 36, 
    backgroundImage: UIImage.imageNamed("week-view-btn") 
end 

ответ

0

Попробуйте перевести вызов на on_create на номер on_load. Свойство view экрана - nil внутри вашего блока init.tap.