以编程方式在IOS中创build视图(它是如何工作的)?

一个小小的背景:我正在浏览CS193P iTune的video,我被困在作业3上的时间最长。 基本上,分配会要求您以编程方式创build自定义视图以在屏幕上显示形状。 顺便说一句,我没有使用任何视图控制器。

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

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

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

但是,如果使用在IB拖动视图,并将类更改为我的视图类,它显示正常。

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

  - (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]; } 

我的控制器的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正在初始化,但drawRect没有被调用。

更具体到你的问题,语法会是

 UIWindow* window = [UIApplication sharedApplication].keyWindow; UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( 0, 0, 200, 150)]; //add code to customize, eg polygonView.backgroundColor = [UIColor blackColor]; [window addSubview:polygonView]; [polygonView release]; 

这是一个你不仅会用到的模式,而且会在之后的子模式中使用。 另外,还有很多模板,viewController已经设置了自己的视图。 当你想创build一个自定义的视图时,你可以像上面那样创build它,而不是上面的方法,而是将viewControllers视图设置为新创build的视图,如下所示:

 viewController.view = polygonView; 

祝你好运!

这是一个古老的问题,但我不知道他得到了他期望的答案 – 听起来像他碰到了我在创build一个UIViewController子类的同样的问题,在界面生成器笔尖中敲一个UIViewController ,但不能弄清楚如何让这两个人一起工作。

如果你单独制作了笔尖(所以它不是和你的class级一起制作的),那么你必须记得点击你放置在界面生成器中的UIViewController,然后从属性面板中点击第三个标签button('Custom Class “)。 Class将是默认的基类UIViewController等 – 只要打开这个下拉列表,你会看到所有的自定义子类的列表,select它和volla – 你已经链接到自定义元素的界面。

希望能够帮助我省下一些麻烦,我发现了一些奇妙的方法,直到我意识到简单的解决scheme。

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

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

当然,如果你有一个从UIViewinheritance的自定义对象,你可以使用它而不是UIView。 当你开始一个新的项目时,创build一个“基于视图的应用程序”,它将使用一个具有相关视图的视图控制器来启动你(可以用“CustomViewController.view”来访问它,它将replace代码片段中的“mainView”以上)。

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

嗨,只需添加此代码,

 [window bringSubviewToFront:polygonView]; right after, [window addSubview:polygonView]; 

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

 [ myCurrentTopView addSubview: myNewCustomView ]; 

它有助于分配和初始化这个自定义视图。

然后,通过执行以下操作,可以在此自定义视图的drawRect中触发一些绘图:

 [ myNewCustomView setNeedsDisplay ]; 

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

你确定你的观点没有显示,或只是你看不到? 将NSLog放入视图的drawRect:方法中(如果使用自定义视图类)。

我最近有一个非常类似的问题,这是什么对我来说:看来,在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方法添加其他视图。

呼叫

 [super drawRect]; 

在drawRect:body的自定义代码之前。