помочь понять взаимодействие между UIVIewController и подклассом UIView - PullRequest
0 голосов
/ 09 декабря 2010

вот текущая ситуация:

TestViewController.h:

#import <UIKit/UIKit.h>
@interface TestViewController : UIViewController {
}
@end

TestViewController.m:

#import "TestViewController.h"
#import "draw.h"
@implementation TestViewController

 - (void)viewDidLoad {
draw.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1].CGColor;
[draw setNeedsDisplay];
[super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}

- (void)dealloc {
[super dealloc];
 }
@end

draw.h:

#import <UIKit/UIKit.h>

@interface draw : UIView {
UIColor* rectColor;
}

@property (retain) UIColor* rectColor;

@end

draw.m:

#import "draw.h"

@implementation draw

@synthesize rectColor;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code.
    }
    return self;
}

- (void)drawRect:(CGRect)rectangle {

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGColorRef myColor = [UIColor colorWithHue:0 saturation:1 brightness:0.61 alpha:1].CGColor;
    CGContextSetFillColorWithColor(context, myColor);
    CGContextAddRect(context, CGRectMake(0, 0, 95.0, 110.0));
    CGContextFillPath(context);
}

- (void)dealloc {
    [super dealloc];
}

@end

затем в Интерфейсном Разработчике я создал UIView 90x115 и установил его Class Identity на "draw".Когда я запускаю приложение (без двух некомпилируемых строк), оно отображает красивый красный прямоугольник в середине экрана.Моя цель состоит в том, чтобы иметь возможность изменить цвет прямоугольника из моего TestViewController.Однако, когда я компилирую тестовое приложение, я получаю следующие ошибки компилятора:

error: accessing unknown 'setRectColor:' class method
error: object cannot be set - either readonly property or no setter found
warning: 'draw' may not respond to '+setNeedsDisplay'

Я знаю, что мне не хватает "ссылки" между моим TestViewController и рисованием, но я не могу понять, как его реализовать.,Я пробовал разные трюки, но ничего не получалось.Может кто-нибудь объяснить, что нужно сделать, чтобы

draw.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1].CGColor;
[draw setNeedsDisplay];

скомпилировал и работал?(Я бы использовал эти знания для создания другого метода в TestViewController, я просто тестирую его внутри viewDidLoad)

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

В опубликованном вами коде вы устанавливаете свойство rectColor и вызываете setNeedsDisplay: при рисовании, но рисование - это ваш класс. Вы должны сделать это с экземпляром. Вам не нужно создавать новое свойство для этого, потому что UIViewController определяет свойство представления. Просто используйте self.view вместо draw в вашем методе viewDidLoad. Кроме того, удалите .CGColor в конце строки.

Во-вторых, ваш метод drawRect: игнорирует этот цвет и использует свой собственный. Изменение

CGColorRef myColor = [UIColor colorWithHue:0 saturation:1 brightness:0.61 alpha:1].CGColor;

до

CGColorRef myColor = self.rectColor.CGColor;
0 голосов
/ 09 декабря 2010

вы определили UIColor* rectColor;, но вы тоже пишите CGColor

draw.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1].CGColor;

попробуй

self.drawCopy.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1];
0 голосов
/ 09 декабря 2010

Большая проблема в том, что вы не объявили свойство для draw;Вы должны сделать это и связать его с объектом Interface Builder, если хотите получить к нему доступ.Решение состоит в том, чтобы создать свойство, которое будет содержать объект draw, и синтезировать его методы установки и получения, используя @synthesize.(именно из этой последней части вы получаете сообщение об ошибке.)

Как только вы измените код на тот, что у меня есть ниже, вам нужно будет установить правильное соединение в Интерфейсном Разработчике, иначе вы найдетечто изменения в вашем коде просто не имеют никакого эффекта, даже если они не содержат ошибок.

Используйте заглавные буквы (всегда!), а затем попробуйте следующее:

TestViewController.h:

#import <UIKit/UIKit.h>
@class Draw; //forward class declaration

@interface TestViewController : UIViewController {
    IBOutlet Draw *drawCopy;
}

@property (nonatomic, retain) Draw *drawCopy;
@end

Тогда для TestViewController.m:

#import "TestViewController.h"
#import "Draw.h"
@implementation TestViewController

@synthesize drawCopy;

-(void) viewDidLoad {
    self.drawCopy.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1];
    [self.drawCopy setNeedsDisplay];
    [super viewDidLoad];
}

- (void)dealloc {
    [drawCopy release];
    [super dealloc];
 }

@end

Я думаю, что это должно сработать.

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