drawRect вызывается в подклассе UIView, но не в UIViewController - PullRequest
1 голос
/ 12 мая 2011

Мой код работает, но мне пришлось создать класс для 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.

Вкладки, созданные программно, а не через перо. Например:

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 ]

10 голосов
/ 12 мая 2011

Вы смешиваете два класса. UIViewController не является UIView, то есть он не наследуется от UIView. Но хорошая новость в том, что у есть представление, объявленное как свойство : это композиция. Метод drawRect доступен только в классе / подклассе UIView.

Если вы хотите перерисовать вид контроллера, вы можете позвонить

[self.view setNeedsDisplay];

в viewController.

Вы можете установить свой собственный пользовательский вид как вид вашего viewController с помощью метода loadView . Это может выглядеть так:

- (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 / Model-View-Controller в официальной документации Apple, он описывает шаблон проектирования MVC.

2 голосов
/ 12 мая 2011

Вы не можете переопределить drawRect в UIViewController, потому что UIViewController не имеет drawRect метода.

Как я понимаю, вы создаете какой-то пользовательский рисунок, так что вы можете создать подкласс UIView (хотя, если вы можете получить те же результаты, не делая этого, лучше). Но затем, если вы хотите контролировать его поведение, вам следует создать подкласс UIViewController.

Убедитесь, что вы понимаете, как MVC работает!

1 голос
/ 19 августа 2011

Установите класс вашего класса, который был унаследован от UIViewController в конструкторе интерфейса класс, унаследованный от UIView и не переопределяющий метод -drawRect: в классе, унаследованном от UIViewController. Определите метод -drawRect: в классе, который был разделен на подклассы от UIView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...