Ios 为什么可以';我是否在Interface Builder中设置自定义UIView的背景色?
我正在深入研究iOS开发,我将从一个非常简单的示例开始,了解如何使用IB创建自定义视图。我有一个简单的视图控制器Ios 为什么可以';我是否在Interface Builder中设置自定义UIView的背景色?,ios,iphone,ios7,Ios,Iphone,Ios7,我正在深入研究iOS开发,我将从一个非常简单的示例开始,了解如何使用IB创建自定义视图。我有一个简单的视图控制器 @interface MyViewController () @property (weak, nonatomic) IBOutlet MyView *myView; @end @implementation MyViewController //Boilerplate code... - (BOOL)application:(UIApplication *)applicatio
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet MyView *myView;
@end
@implementation MyViewController
//Boilerplate code...
- (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;
}
我的自定义视图
@implementation MyView
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
self.backgroundColor = [UIColor redColor];
}
return self;
}
在应用程序委托中,我将根视图控制器设置为MyViewController
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet MyView *myView;
@end
@implementation MyViewController
//Boilerplate code...
- (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
的nib和一个用于MyView
的nib。在MyViewController的nib中,我将UIView拖到它的中心,并将该视图的类设置为MyView
。当我运行应用程序时,我会看到背景颜色为红色的MyView
视图。这里是我的问题:当我注释掉MyView
实现文件中设置背景色为红色的代码行,并使用MyView
的nib在interface builder中将背景色设置为其他颜色时,视图的背景色为白色。为什么我不能在Interface Builder中设置MyView
的背景色?为什么只有通过编程方式进行设置时才会设置它
提前感谢您的智慧 这最终非常简单,但有点棘手 你需要意识到一个重要的事实。在Interface Builder中看到的是对象的“冻结实例”。它们在各自所有者类初始化期间被唤醒 仔细想想你建立的关系以及初始化过程中发生的步骤。 您的VC被设置为根视图控制器。这意味着,在屏幕上可以看到VCs nib文件的内容,即两个视图(UIview类实例) 1) 视图控制器视图 2) 另一个UIview(您已将其类设置为MyView) 现在,如果您在MYview.m中重写initWithCoder,当然它会被执行,并且颜色设置为红色。这是因为您在VCs nib中设置了UIview的2(在上面)实例是自定义类,即MYview 另一方面,如果你转到MYView nib文件,你可以在这里设置任何你想要的,但你不会在屏幕上看到它。为什么?因为这个例子永远不会被唤醒。它只是一个nib文件,位于项目中,不被使用。您在屏幕上看到的实例是来自主VC视图(它是它的子视图)的实例 基本上,您有一个接口文件MyView.h、一个实现文件MyView.m和这个类的两个实例。两者都被冻结在笔尖中。一个在VC的nib中,另一个在MyView.nib中。您只是不使用MyView.nib
解决方案超出了您的问题范围。好的,谢谢Earl。我想我明白了。我可以问一下,添加自定义视图(在nib中完全设置了样式)作为子视图的最佳实践是什么吗?我应该使用alloc、initWithFrame和addSubView以编程方式添加它吗?下面是正确的解决方案