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

Hot*_*day 1 cocoa-touch objective-c uiviewcontroller uiview ios

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

顺便说一句,我曾尝试[self setNeedsDisplay]ViewDidLoad该的UIViewController子类的文件,但没有奏效.

这是代码,它在UIViewSubclass上工作但不会在一个上调用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);
}
Run Code Online (Sandbox Code Playgroud)

关于尝试什么的任何想法?顺便说一句,这是一个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];
Run Code Online (Sandbox Code Playgroud)

我很感激任何想法.我已经浏览了这个网站上setNeedsDisplay没有打电话drawRect的答案,但没有找到我的具体案例的答案.

谢谢.

Nic*_*ver 10

你正在混合两个班级.UIViewController不是UIView,这意味着它不会从UIView继承.但好消息是它有一种观点,被宣称为财产:它的构成.drawRect方法仅在UIView类/子类中可用.

如果你想强制控制器的视图重绘,你可以打电话

[self.view setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)

在viewController中.

您可以使用loadView方法将自己的自定义视图设置为viewController的视图.它可能看起来像这样:

- (void)loadView
{  
    MySubclassOfUIView *rootView = [[MySubclassOfUIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // do more view configuration ...

    self.view = rootView;
    [rootView release];
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以将您的绘图代码分隔在MySubclassOFUIView.m文件中.

关于UIViewController:

UIViewController类为iPhone应用程序提供基本的视图管理模型.基本视图控制器类支持相关视图的呈现,支持管理模态视图,并支持旋转视图以响应设备方向更改.

UIView的目的:

UIView类在屏幕上定义了一个矩形区域,以及用于管理该区域内容的接口.在运行时,视图对象处理其区域中任何内容的呈现,并处理与该内容的任何交互.

看看可可核心竞争力/模型-视图-控制器苹果的官方文档中,它描述了MVC设计模式.