pourquoi il l'habitude de reconnaître les @properties à partir du fichier d'en-tête du fichier principal?
-
12-09-2019 - |
Question
UIView.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface UIView : UIResponder {
IBOutlet UILabel *endLabel;
IBOutlet UIButton *goButton;
IBOutlet UITextField *textBox1;
IBOutlet UITextField *textBox2;
@property(nonatomic, retain) UILabel *endLabel;
@property(nonatomic, retain) UIButton *goButton;
@property(nonatomic, retain) UITextField *textBox1;
@property(nonatomic, retain) UITextField *textBox2;
}
- (IBAction)goButtonClicked;
@end
UIView.m
#import "UIView.h"
@implementation UIView
@synthesize textBox1, goButton;
@synthesize textBox2, goButton;
@synthesize textBox1, endLabel;
@synthesize textBox2, endLabel;
@synthesize goButton, endLabel;
- (IBAction)goButtonClicked {
}
@end
La solution
Pour aller un peu fou avec les @synthesize
s, sommes-nous? Je crois que votre principal problème ici est que les déclarations de @property
doivent être après la fermeture} de @interface
.
Je suis surpris que le compilateur n'a pas jeté un drapeau rouge de la taille du Groenland, quoique.
En outre, vous vouliez dire probablement faire une sous-classe personnalisée de UIView
; Je vais utiliser MyView
.
//MyView.m -- correct synthesize declaration
@synthesize textBox1, goButton, textBox2, endLabel;
//MyView.h -- correct interface declaration
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface MyView : UIView {
IBOutlet UILabel *endLabel;
IBOutlet UITextField *textBox1;
IBOutlet UITextField *textBox2;
IBOutlet UIButton *goButton;
}
@property(nonatomic, retain) UIButton *goButton;
@property(nonatomic, retain) UILabel *endLabel;
@property(nonatomic, retain) UITextField *textBox1;
@property(nonatomic, retain) UITextField *textBox2;
@end
Autres conseils
Le premier problème est que vous désignez votre classe UIView, qui existe déjà dans UIKit. Voir @ de Williham conseils sur la résolution de ce.
Vous avez seulement besoin d'un @synthesize
par propriété, et lorsque le nom de la propriété correspond à l'instance nom de variable, vous ne devriez avoir besoin de faire quelque chose comme ceci dans votre fichier .m:
@synthesize endLabel;
@synthesize goButton;
@synthesize textBox1;
@synthesize textBox2;
, vous êtes également susceptible de rencontrer des problèmes à obtenir votre méthode de IBAction
travailler. Pour utiliser une méthode pour une liaison cible action, il doit avoir un type de retour de IBAction
(que vous avez correct) et accepter un paramètre id
représentant l'expéditeur. La signature de la méthode canonique ressemble à ceci:
- (IBAction) goButtonClicked:(id)sender;
Je recommande en fait un nom de méthode qui n'est pas explicitement lié au bouton qui invoque, d'autant plus qu'il pourrait y avoir d'autres façons d'invoquer la même action. (Par exemple, si vous écrivez une application de bureau, une clé commande équivalente ou le menu pourrait faire la même chose.)