pourquoi il l'habitude de reconnaître les @properties à partir du fichier d'en-tête du fichier principal?

StackOverflow https://stackoverflow.com/questions/1116690

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
Était-ce utile?

La solution

Pour aller un peu fou avec les @synthesizes, 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.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top