drawRect 在 UIView 子类上被调用,但不在 UIViewController 上
Posted
技术标签:
【中文标题】drawRect 在 UIView 子类上被调用,但不在 UIViewController 上【英文标题】:drawRect gets called on UIView subclass but not on UIViewController 【发布时间】:2011-05-11 20:54:50 【问题描述】:到目前为止,我的代码工作正常,但我必须为 UIView
创建一个类。这有点不方便,因为我也需要与 ViewController 交互。
顺便说一句,我确实在UIViewController
子类文件的ViewDidLoad
上尝试了[self setNeedsDisplay]
,但没有成功。
这是代码,它适用于 UIView
子类,但不会在 UIViewController
上调用:
- (void)drawRect:(CGRect)rect
UIColor *currentColor = [UIColor redColor];
CGContextRef context = UIGraphicsGetCurrentContext();
someNum = 1;
CGContextBeginPath(context);
CGContextMoveToPoint(context, 30, 40);
[self addDotImageX:30 andY:40];
CGContextSetLineWidth(context, 2);
CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
CGContextStrokePath(context);
有什么想法可以尝试吗?顺便说一句,这是一个 TabBar 应用程序。我知道那些会以某种方式阻止对drawRect
的调用。
以编程方式创建的选项卡,而不是通过 Nib。例如:
NSMutableArray *listOfViewControllers = [[NSMutableArray alloc] init];
UIViewController *vc;
vc = [[Education alloc] init];
vc.title = @"Education";
[listOfViewControllers addObject:vc];
vc.tabBarItem.image = [UIImage imageNamed:@"info.png"];
[vc release];
我会很感激任何想法。我已经浏览了这个网站上与setNeedsDisplay
不调用drawRect
相关的答案,并且没有找到适合我的特殊情况的答案。
谢谢。
【问题讨论】:
【参考方案1】:你混淆了两个班级。 UIViewController 不是 UIView,这意味着它不继承自 UIView。但好消息是它has a view, declared as property:它是作曲。 drawRect 方法仅在 UIView 类/子类中可用。
如果你想强制控制器的视图重绘你可以调用
[self.view setNeedsDisplay];
在视图控制器中。
您可以使用loadView 方法将自己的自定义视图设置为viewController 的视图。它可能看起来像这样:
- (void)loadView
MySubclassOfUIView *rootView = [[MySubclassOfUIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// do more view configuration ...
self.view = rootView;
[rootView release];
因此,您可以在 MySubclassOFUIView.m 文件中将绘图代码分开。
关于UIViewController:
UIViewController 类提供 基本视图管理模型 适用于 iPhone 应用程序。基础的 视图控制器类支持 相关视图的呈现, 支持管理模态视图,以及 支持旋转视图作为响应 以更改设备方向。
以及UIView的目的:
UIView 类定义了一个矩形 屏幕和界面上的区域 用于管理该区域的内容。 在运行时,视图对象处理 渲染其区域内的任何内容 并且还处理与 那个内容。
看看苹果官方文档中的Cocoa Core Competencies / Model-View-Controller,它描述了MVC设计模式。
【讨论】:
我很抱歉,我没有正确地表达我的问题,但您仍然给了我答案。我确实知道 UIVIew 和 UIViewcontroller 是不同的类,并且 UIViewController 有它自己的视图。只是,出于某种原因,在我发现每个人都在使用的所有示例中:[self setNeedsDisplay];。当然,添加视图会有所不同。非常感谢! 一切都好,我只是不知道你是否了解大局,所以我必须深入了解一些细节。 @NickWeaver:你的答案,请赐教!谢谢。我只是想你如何覆盖一个drawRect视图,当你使用的是NSViewController 谢谢! ! ! !对于这个答案:)【参考方案2】:您不能在 UIViewController 中覆盖 drawRect
,因为 UIViewController 没有 drawRect
方法。
据我了解,您正在制作一些自定义绘图,因此您可以将 UIView 子类化(尽管如果您不这样做也可以获得相同的结果,那就更好了)。但是如果你想控制它的行为,那么你应该继承 UIViewController。
确保您了解MVC 的工作原理!
【讨论】:
我认为您的意思是“财产”?无论如何,不,你不能。就像尼克刚刚指出的那样,您将两个课程混为一谈!重写方法仅在继承具有该方法的基类时有效。 好的,删除该评论。我的坏...在某种程度上。你不能在 UIViewController 上调用 drawRect PROPERTY 但你可以从它调用它。我现在是吗,教授? ;-) 我了解视图和控制器之间的区别。我只是很难使用这种语言,因为我对它有点陌生。请跟我裸露。 没关系,你会习惯的。 :) 确保您了解继承和多态在 OOP 中的工作原理......我认为您在这里误解了一些基本概念。【参考方案3】:在界面生成器中设置你的类的继承自UIViewController
的类
从UIView
继承的类,并且不要覆盖从UIViewController
继承的类中的-drawRect:
方法。在从UIView
子类化的类中定义-drawRect:
方法。
【讨论】:
以上是关于drawRect 在 UIView 子类上被调用,但不在 UIViewController 上的主要内容,如果未能解决你的问题,请参考以下文章
XIB 中的 UIView 子类不显示(drawRect:从未调用)
如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景