2011-01-27 53 views
15

稍微背景:我正在浏览CS193P iTune视频,并且我在作业3上停留时间最长。基本上,分配会要求您以编程方式创建自定义视图以在屏幕上显示形状。顺便说一下,我没有使用任何视图控制器。以编程方式在IOS中创建视图(它是如何工作的)?

我无法让我的视图显示,直到我终于在Interface Builder中拖动一个View对象,并将对象名称更改为我的自定义视图类。所以我的问题是,当人们说以编程方式创建一个视图,他们只是说手动创建类,但是当你需要显示它使用IB?我不禁感到我误解了某些东西?

编辑:让我更清楚。我的自定义视图已用0,0,200,150帧初始化,并且drawRect被重写以在其中绘制方形。我的看法甚至不显示了,如果尝试我的控制器内将其添加到主窗口:

UIWindow* window = [UIApplication sharedApplication].keyWindow; 
[window addSubview:polygonView]; 

但是,如果使用拖放在IB的视图,并更改类到我的视图类,它显示了罚款。

编辑:添加了一些代码。这是我的控制器的awakeFromNib方法,应该绘制视图。我控制器updateInterface方法

- (void)awakeFromNib { 
    shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12]; 
    polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    UIWindow *window = [UIApplication sharedApplication].keyWindow; 
    polygonView.backgroundColor = [UIColor blackColor]; 
    [window addSubview:polygonView]; 
    [self updateInterface]; 
} 

部分:

- (void)updateInterface { 
    [polygonView setPolygon:shape]; 
    [polygonView setNeedsDisplay]; 
... 
} 

PolygonView.h

#import <UIKit/UIKit.h> 
#import "PolygonShape.h" 

@interface PolygonView : UIView { 
    IBOutlet PolygonShape *polygon; 
} 

@property (readwrite, assign) PolygonShape *polygon; 

- (void)drawRect:(CGRect)rect; 
@end 

PolygonView.m

#import "PolygonView.h" 

@implementation PolygonView 
@synthesize polygon; 

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 
     nslog(@"initialized"); 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
     CGRect bounds = [self bounds]; 

    [[UIColor grayColor] set]; 
    UIRectFill(bounds); 

    CGRect square = CGRectMake(10, 10, 10, 100); 
    [[UIColor blackColor] set]; 
    UIRectFill(square); 

    [[UIColor redColor] set]; 
    UIRectFill(square); 
    NSLog(@"drawRect called"); 
} 
@end 

的polygonView正在初始化,但ISN的drawRect不会被打扰d。

+0

keyWindow在哪里被创建?如果你没有加载nib文件(从你的问题中不清楚你是否是),那么在添加子视图之前,你必须先创建窗口。 – jlehr 2011-01-27 22:24:14

+0

它正在AppDelegate类中创建。这是否意味着我必须#import我的PolygonView类并在那里创建它? – 2011-01-28 05:13:22

+0

有趣的是,如果我把我的视图的初始化和添加到我的updateInterface方法的窗口,它的工作原理,但只有当我点击一个调用该方法的按钮后。看起来好像代码不在awakeFromNib中进行处理。有任何想法吗? – 2011-01-28 18:44:24

回答

16

为了更加具体到你的问题,语法将

UIWindow* window = [UIApplication sharedApplication].keyWindow; 

UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 200, 150)]; 
//add code to customize, e.g. polygonView.backgroundColor = [UIColor blackColor]; 

[window addSubview:polygonView]; 
[polygonView release]; 

这是一个你不仅可以使用这种模式,还可以使用子模式。另外,还有很多模板,viewController已经设置了它自己的视图。当你想自定义视图,你喜欢在其上创建,而是方法的上方设置了viewControllers查看到新创建的视图,像这样:

viewController.view = polygonView; 

祝你好运!

2

您需要有一个视图(或窗口)来添加子视图。正常的语法是这样的:

UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds]; 
[mainView addSubview:newView]; 
[newView release]; 

当然,如果你有一个从UIView的继承的自定义对象,你会用这个来代替的UIView。当你开始一个新项目时,创建一个“基于视图的应用程序”,它将使用一个带有关联视图的视图控制器来启动你(可以用“CustomViewController.view”来访问它,它将替换代码片段中的“mainView”以上)。

如果您想在应用程序启动时以编程方式创建视图,请将代码放置在视图控制器的“ - (void)viewDidLoad”方法中。

+0

我知道一个视图控制器将会走的路,但在这个特定的任务中,只有一个模型类,一个控制器类和自定义视图类。你是说我必须将我的视图对象添加到主窗口?我将如何以及在哪里做到这一点? – 2011-01-27 18:18:48

0

在您的活动控制器类中的某处,您可以将自定义视图添加到当前顶级视图。

[ myCurrentTopView addSubview: myNewCustomView ]; 

它有助于首先分配和初始化此自定义视图。

然后,您可以通过触发该自定义视图的drawRect一些绘图一个:

[ myNewCustomView setNeedsDisplay ]; 
0

您是否将视图的背景颜色设置为可区分的?

您确定您的视图不显示吗​​?还是仅仅是您看不到它?将NSLog放入视图的drawRect:方法中(如果使用自定义视图类)。

4

这是一个古老的问题,但我不确定他是否得到了他期望的答案 - 这听起来像是他遇到了我在创建子类时所遇到的同样问题,在界面构建器笔尖中敲了一个UIViewController但然后无法弄清楚如何让两个人一起工作。

如果你单独制作了笔尖(所以它不是为你和你的班级一起制作的),那么你必须记住点击你放置在界面生成器中的UIViewController,然后从属性面板中点击第三个标签按钮('自定义类')。 Class将作为默认基类UIViewController等 - 只需打开此下拉列表,您将看到所有自定义子类的列表,选择它和volla - 您已将自定义元素链接到界面。

希望能够拯救某些人,让我了解这些日子,我找到了一些愚蠢的奇妙方式来解决它,直到我意识到简单的解决方案。

0

最近我有一个非常类似的问题,这里是我的工作: 看来,当在Xcode 4.3.2中的一个'空应用程序'开始,你必须设置你的视图作为根视图你的主窗口使用setRootViewController方法代替addSubview。所以:

// Initialize myView and then 
[window setRootViewController:myView]; 
// instead of [window addSubview:myView]; 
// the rest as normal... 
[window makeKeyAndVisible]; 

之后,您可以使用addSubview方法来添加其他视图。

2

喜只需添加此代码,

[window bringSubviewToFront:polygonView]; 

right after, 
[window addSubview:polygonView]; 
0

呼叫

[super drawRect]; 

在drawRect中您的自定义代码之前:身体。

相关问题