Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么可以';我是否在Interface Builder中设置自定义UIView的背景色?_Ios_Iphone_Ios7 - Fatal编程技术网

Ios 为什么可以';我是否在Interface Builder中设置自定义UIView的背景色?

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

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

@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以编程方式添加它吗?下面是正确的解决方案