为什么我不能在Interface Builder中设置自定义UIView的背景颜色?

时间:2014-02-08 15:52:44

标签: ios iphone ios7

我正在深入研究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;
}

并在app委托中,我将根视图控制器设置为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的nib将背景颜色设置为其他颜色。界面构建器,视图的背景颜色为白色。为什么我不能在Interface Builder中设置MyView的背景颜色?为什么只有在我以编程方式设置它时才会设置?

提前感谢您的智慧!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

使这项工作的解决方案超出了你的问题范围。