我正在深入研究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
的背景颜色?为什么只有在我以编程方式设置它时才会设置?
提前感谢您的智慧!
答案 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。
使这项工作的解决方案超出了你的问题范围。