【问题标题】:Why can't I set the background color of my custom UIView in Interface Builder?为什么我不能在 Interface Builder 中设置自定义 UIView 的背景颜色?
【发布时间】:2014-03-06 01:37:36
【问题描述】:

我正在深入研究 iOS 开发,我从一个非常简单的示例开始,以了解如何使用 IB 创建自定义视图。我有一个简单的视图控制器...

@interface MyViewController ()
@property (weak, nonatomic) IBOutlet MyView *myView;
@end

@implementation MyViewController
//Boilerplate code...

还有我的自定义视图...

@implementation MyView

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.backgroundColor = [UIColor redColor];
    }
    return self;
}

在应用委托中,我将根视图控制器设置为 MyViewController...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    MyViewController *myVC = [[MyViewController alloc] init];
    self.window.rootViewController = myVC;
    [self.window makeKeyAndVisible];
    return YES;
}

所以我有一个用于MyViewController 的笔尖和一个用于MyView 的笔尖。在 MyViewController 的 nib 中,我将一个 UIView 拖到它的中心,并将该视图的类设置为 MyView。当我运行该应用程序时,我看到了带有红色背景颜色的 MyView 视图。这是我的问题:当我注释掉 MyView 实现文件中将背景颜色设置为红色的代码行,而是使用MyView 的笔尖在界面生成器中将背景颜色设置为其他颜色时,视图的背景颜色为白色。为什么我不能在 Interface Builder 中设置 MyView 的背景颜色?为什么只有在我以编程方式设置时才会设置?

提前感谢您的智慧!

【问题讨论】:

    标签: ios iphone ios7


    【解决方案1】:

    它最终非常简单,但有点棘手。

    你需要认识到一个重要的事实。您在 Interface Builder 中看到的东西是对象的“冻结实例”。它们在初始化期间被各自的所有者类唤醒。

    彻底考虑您已建立的关系以及初始化期间发生的步骤。 您的 VC 被设置为根视图控制器。这意味着,在您的屏幕上,您会看到 VCs nib 文件的内容,即两个视图(UIview 类实例) 1) ViewController 的视图 2) 另一个 UIview (你已经将它的类设置为 MyView)..

    现在,如果您在 MYview.m 中覆盖 initWithCoder,它当然会被执行并且颜色设置为红色。这是因为您在 VC 笔尖中设置了 UIview 的 2)(在那里)实例是自定义的ieMyView 类。

    另一方面,如果您转到 MYView nib 文件..您可以在此处设置您想要的任何内容,但您不会在屏幕上看到它。为什么?因为这个实例永远不会被唤醒。它只是一个 nib 文件,位于项目中并且未使用。您在屏幕上看到的实例是来自主 VC 视图(它是其子视图)的实例。

    基本上你有 1 个接口文件 MyView.h、1 个实现文件 MYView.m 和这个类的两个实例。两者都冷冻在笔尖中。一个在 VC 的 nib 中,另一个在 MyView.nib 中。您只是不使用 MyView.nib。

    完成这项工作的解决方案超出了您的问题范围。

    【讨论】:

    • 好的,谢谢厄尔。我觉得我明白了。我可以问一下添加自定义视图的最佳做法是什么,它在笔尖中完全样式化,作为子视图?我应该使用 alloc、initWithFrame 和 addSubView 以编程方式添加它吗?
    • 这是正确的解决方案stackoverflow.com/questions/5246074/…
    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2011-02-11
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多