首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RubyMotion:打开新屏幕后失去超级视图

RubyMotion:打开新屏幕后失去超级视图
EN

Stack Overflow用户
提问于 2013-12-24 00:54:58
回答 1查看 196关注 0票数 1

我使用的是ProMotion、Teacup和MMDrawerController的组合。当我加载应用程序时,一切都很好,但是当我尝试从一个屏幕切换到另一个屏幕时,我在Teacup上得到了一个错误,因为superview是零。Teacup错误是:*** Terminating app due to uncaught exception 'NoMethodError', reason: 'calculations.rb:15:in calculate:': undefined method 'bounds' for nil:NilClass (NoMethodError)。因为view.superview是空的,所以会抛出它。

我是初学者,但我觉得Teacup错误只是我设置所有东西的方式(或者可能与MMDrawerController不兼容)的一个更大问题的症状。

所以,这个应用程序加载到WeekScreen,在WeekScreen上,我添加了一个带按钮的导航栏,返回到WeekScreen。当我点击那个按钮时,我会得到错误。(我在这里简化了代码-我真的没有一个带有按钮的页面应用程序可以返回到同一个屏幕)

screens/root_screen.rb

代码语言:javascript
复制
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

screens/week_screen.rb

代码语言:javascript
复制
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

styles/week_styles.rb

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2014-04-18 17:35:38

尝试将对on_create的调用移到on_load内部。屏幕的view属性是init.tap块中的nil

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20753413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档