2010-12-09 7 views
0

est ici la situation actuelle:aide interaction entre la sous-classe compréhension UIViewController et UIView

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 

puis dans l'Interface Builder J'ai créé un UIView de 90x115 et mis sa catégorie identité à « dessiner ». Lorsque j'exécute l'application (sans les deux lignes de non-compilation), il affiche un joli rectangle rouge au milieu de l'écran. Mon but est de pouvoir changer la couleur du rectangle depuis mon TestViewController. Cependant, lorsque je compile l'application test, je reçois les erreurs du compilateur suivantes:

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' 

Je sais que je suis absent « un lien » entre mon TestViewController et d'en tirer, mais ne peut pas comprendre comment s'y prendre pour la mettre en œuvre. J'ai essayé différentes astuces, mais rien n'a fonctionné. Quelqu'un pourrait-il expliquer s'il vous plaît ce qui doit être fait pour que

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

pour compiler et travailler? (J'utiliserais cette connaissance pour créer une méthode différente dans TestViewController, je la teste juste dans viewDidLoad)

+0

hey, j'ai pris les choses de délégué de l'application, car il faisait la question très longue et certainement n'a pas été connecté à cette erreur. J'espère que cela t'aides! –

+0

merci. Je n'étais pas sûr, c'est pourquoi je l'ai mis là. – TrekOnTV2017

Répondre

1

Dans le code affiché, vous définissez la propriété rectColor et appellent setNeedsDisplay: le tirage au sort, mais piochée est ta classe. Vous devez le faire à l'instance.Vous ne devriez pas avoir besoin de créer une nouvelle propriété car UIViewController définit la propriété view. Utilisez simplement self.view au lieu de draw dans votre méthode viewDidLoad. En outre, supprimez le .CGColor à la fin de la ligne. Deuxièmement, votre méthode drawRect: ignore cette couleur et utilise la sienne. Changer

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

à

CGColorRef myColor = self.rectColor.CGColor; 
+0

vous êtes un as, monsieur. dès que j'ai changé la ligne CGColorRef, les choses ont commencé à cliquer. Je savais qu'il y avait quelque chose qui me manquait. Maintenant je sais. Je vous remercie! – TrekOnTV2017

0

Le gros problème ici est que vous n'avez pas déclaré de propriété pour draw; vous devez le faire et le lier à votre objet Interface Builder si vous voulez y accéder. La solution consiste à créer une propriété qui va contenir l'objet draw et synthétiser ses paramètres et ses getters à l'aide de @synthesize. (cette dernière partie est la raison pour laquelle vous obtenez l'erreur.)

Une fois que vous avez modifié le code en fonction de ce que j'ai ci-dessous, vous devez effectuer la connexion appropriée dans Interface Builder, sinon vous constaterez que votre les modifications de code n'ont tout simplement aucun effet, même si elles sont sans erreur.

Capitaliser vos noms de classe (toujours!), Puis essayez ceci:

TestViewController.h:

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

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

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

Ensuite, pour 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 

Je pense que devrait faire l'affaire.

+0

Je pense que j'ai bien fait les changements, mais j'ai quand même une erreur ........ warning: passer l'argument 1 de 'setRectColor:' du type pointeur incompatible ....... c'est à soi-même .drawCopy.rectColor = [UIColor colorWithHue: 0 saturation: 1 luminosité: 0,9 alpha: 1] .CGColor; – TrekOnTV2017

+0

ah, whoops - essayez de supprimer le '.CGColor' de la fin, donc vous êtes juste en train d'assigner un' UIColor' à la propriété. Je vais changer mon code pour refléter ça! –

+0

cool. maintenant il compile. J'ai branché le propriétaire du fichier à drawCopy outlet dans IB, mais quand je lance l'application, je ne vois pas de changement de couleur. Pourrait-il avoir quelque chose à la avec le fait que dans la sous-classe UIView je fais ..... CGColorRef myColor = [UIColor colorWithHue: 0 saturation: 1 luminosité: 0,5 alpha: 1] .CGColor; CGContextSetFillColorWithColor (context, myColor); .... mais dans le ViewController je fais: self.drawCopy.rectColor = [UIColor colorWithHue: 0 saturation: 1 luminosité: 0.5 alpha: 0.5]; – TrekOnTV2017

0

vous definde UIColor* rectColor; mais u écrire un CGColor aussi, il

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

essayer

self.drawCopy.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1]; 
+0

merci. ça a arrangé ça. – TrekOnTV2017

Questions connexes