设置UIView背景颜色的方法

4
我正在尝试在自定义视图类的 .m 文件中实现此操作,该类并非从 XIB 中加载,而是以编程方式加载:

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    // Initialization code

    self.backgroundColor=[UIColor redcolor];
}
return self;
}

无论我是在initWithFrame方法还是其他方法中设置背景颜色,结果都一样。背景颜色属性不起作用。但是从拥有这个自定义视图的控制器中,我可以通过以下方式成功设置背景颜色:

self.mycustomview.backgroundColor=[UIColor redcolor];

但我希望能够在自定义视图内部完成此操作,使其独立。控制器和自定义视图都会导入UIKit。
我还尝试了通过Code Sense提供的以下方法:
    self.View.backgroundColor=[UIColor redcolor];

但这也不起作用。我在这里尝试了viewView。我确定我忽略了一些非常明显的东西。
在视图控制器中,我有这个,它可以正常工作。自定义视图称为“mapButtons.h”:
- (void)viewDidLoad
{
CGRect frame=CGRectMake(0, 0, 320, 460);
self.mapButtons=[[mapButtons alloc] initWithFrame:frame];
self.mapButtons.backgroundColor=[UIColor redColor];

[self.view addSubview:self.mapButtons];

定制视图的.h文件如下所示:
#import <UIKit/UIKit.h>

@interface mapButtons : UIView

当我编译时,出现了这个错误:“请求成员backgroundcolor是不是结构体或联合体”。 - johnbakers
2个回答

5
如果你的视图是从XIB创建的(即你使用Interface Builder将其添加到其他视图中),那么-initWithFrame:将不会被调用。从XIB加载的对象将接收-initWithCoder:。尝试这样做:
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];

    if(self)
    {
        self.backgroundColor = [UIColor redColor];
    }

    return self;
}

谢谢,但我是以编程方式添加视图,没有涉及XIB。我会更新问题以反映这一点。 - johnbakers

2
我已经重新测试过了,这是我正在进行的完整源代码,可以正常工作。
// MapButtons.h
#import <UIKit/UIKit.h>

// As a note you normally define class names starting with a capital letter
// but I did test this with mapButtons as you had it
@interface MapButtons : UIView

@end

// MapButtons.m
#import "mapButtons.h"

@implementation mapButtons

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
      // Initialization code
      self.backgroundColor = [UIColor redColor];
    }
    return self;
}

@end

// TestAppDelegate.m
@implementation TestAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{  
    MapButtons *view = [[MapButtons alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    [self.window addSubview:view];

    [self.window makeKeyAndVisible];
    return YES;
}

xcode不能自动补全代码这一事实很奇怪,但我发现这个问题只是偶尔出现,所以我没有真正的解决方案。有时人们建议删除项目衍生数据并重新启动xcode。


嗯...可能还有其他问题。在我输入“backgroundcolor”时,XCode甚至都没有自动完成;尽管在拥有此视图控制器的视图控制器中会这样做。你在MyView.h/m文件的顶部导入了什么? - johnbakers
你的自定义视图是否继承了 UIView?例如:@interface MyView : UIView - Paul.s
是的,它是扩展UIView的,并且我确实可以从控制器上更改其背景颜色,但无法在视图内部进行更改。非常奇怪。 - johnbakers
这让我想到你的视图中有一个 UIView 的实例而不是你的自定义子类,因为你没有正确地调用它。我们能看一下你实例化自定义视图的代码吗? - Paul.s
我已经在我的答案中添加了这个...但是我认为还有更根本的问题,因为为什么XCode甚至不让我在视图中自动完成"self.backgroundcolor"的输入,但却让我在控制器中自动完成它?每当XCode不提供自动完成时,通常意味着您正在尝试做一些不可用的事情。 - johnbakers
你可能不会相信,我完全关闭了XCode并重新打开。现在可以使用背景颜色的点表示法,并且一切都可以正常运行而没有错误!这是一个XCode问题。真是松了一口气。我也注意到自己无法访问self.subviews。现在一切都好了。 - johnbakers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接