0

我正在编写一个 Rubymotion 应用程序,我想自定义 TabBar。在 NSScreencasts.com 上,他们解释了如何在 Objective-C 中执行此操作,但我如何将以下代码转换为 Ruby?

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self customize];        
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self customize];
    }
    return self;
}

- (void)customize {
    UIImage *tabbarBg = [UIImage imageNamed:@"tabbar-background.png"];
    UIImage *tabBarSelected = [UIImage imageNamed:@"tabbar-background-pressed.png"];
    [self setBackgroundImage:tabbarBg];
    [self setSelectionIndicatorImage:tabBarSelected];
}

@end

这是我的尝试:

class CustomTabbar < UITabBarController
  def init
    super
    customize
    self
  end

  def customize
    tabbarBg = UIImage.imageNamed('tabbar.jpeg')
    self.setBackgroundImage = tabbarBg
  end
end

但是,如果我运行它,我会收到此错误:

Terminating app due to uncaught exception 'NoMethodError', reason: 'custom_tabbar.rb:5:in `init': undefined method `setBackgroundImage=' for #<CustomTabbar:0x8e31a70> (NoMethodError)

更新

*这是我的 app_delete 文件:*

class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    first_controller = FirstController.alloc.init
    second_controller = SecondController.alloc.init

    tabbar_controller = CustomTabbar.alloc.init
    tabbar_controller.viewControllers = [first_controller, second_controller]

    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = tabbar_controller
    @window.makeKeyAndVisible
    true
  end
end
4

1 回答 1

1

根据我们的“聊天”,在我看来,您对视图和控制器的正确层次结构感到非常困惑。控制器是拥有视图的对象,但控制器没有任何视觉属性。视图具有视觉效果(如背景图像)。因此,例如,当您有一个标签栏时,您实际上有: 1) TabBarController 2) TabBar(视图)。

现在,TabBar 是一个视图,它有一个名为“backgroundImage”的属性,您可以通过它更改背景。当然,TabBarController 没有这样的东西,但它有一个“内部”控制器列表。

让我向您展示一些您想要的代码。它在 Obj-C 中,但将其重写为 Ruby 应该很简单。我在 AppDelegate 的 didFinishLaunchingWithOptions 方法中有这个:

UITabBarController *tbc = [[UITabBarController alloc] init];

UIViewController *v1 = [[UIViewController alloc] init];
UIViewController *v2 = [[UIViewController alloc] init];

tbc.viewControllers = @[v1, v2];
tbc.tabBar.backgroundImage = [UIImage imageNamed:@"a.png"];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = tbc;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;

请注意,TabBarController 有一个属性“viewControllers”——这是一个内部控制器列表。它还有一个属性“tabBar”,它是对视图 UITabBar 的引用。我访问它并设置背景图像。

于 2012-11-16T12:42:52.927 回答