drawRect在UIView子类上调用,但不在UIViewController上调用

时间:2011-05-11 20:54:51

标签: objective-c cocoa-touch ios uiview uiviewcontroller

我的代码到目前为止工作但我必须为UIView创建一个类。这有点不方便,因为我也需要与ViewController进行交互。

顺便说一句,我确实在[self setNeedsDisplay]子类文件的ViewDidLoad上尝试UIViewController,但它没有用。

这是代码,它适用于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相关的答案,但没有找到我特定案例的答案。

感谢。

3 个答案:

答案 0 :(得分:10)

你正在混合两个班级。 UIViewController不是UIView,这意味着它不会从UIView继承。但好消息是它has a view, declared as property:它的构成。 drawRect方法仅在UIView类/子类中可用。

如果您想强制重绘控制器的视图,可以调用

[self.view setNeedsDisplay];
viewController中的

您可以使用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类定义了一个矩形   屏幕上的区域和界面   用于管理该区域的内容。   在运行时,视图对象处理   呈现其所在地区的任何内容   并且还处理与之的任何交互   那个内容。

在Apple官方文档中查看Cocoa Core Competencies / Model-View-Controller,它描述了MVC设计模式。

答案 1 :(得分:2)

你不能在UIViewController中覆盖drawRect,因为UIViewController没有drawRect方法。

据我所知,你正在制作一些自定义绘图,所以你可以将UIView子类化(尽管如果没有这样做可以得到相同的结果,那就更好了)。但是如果你想控制它的行为,那么你应该继承UIViewController。

确保您了解MVC的工作方式!

答案 2 :(得分:1)

在接口构建器中设置继承自UIViewController的类的类 继承自UIView的类,并且不会覆盖从-drawRect:继承的类中的UIViewController方法。在类中定义-drawRect:方法,该方法已从UIView

进行了子类化