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 显示黑色背景

加速 -drawRect: UIView 子类的方法

更新 UIView 子类中 drawRect 中绘制的组件中的文本

对于drawRect使用,谨慎使用!

UIView drawRect 安静崩溃