2012-02-16 4 views
0

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

ViewController.h

#import <UIKit/UIKit.h> 

@interface TNRViewController : UIViewController { 

    IBOutlet UITextField *textBox; 
    IBOutlet UILabel *label; 
} 
- (IBAction)button:(id)sender; 

@end 

ViewController.m

#import "TNRViewController.h" 

@implementation TNRViewController 
@synthesize textBox; 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)dealloc { 
    [textBox release]; 
    [label release]; 
    [super dealloc]; 
} 
- (IBAction)button:(id)sender { 
    NSString *Name = textBox.text; 
    NSString *Output = Nil; 
    Output = [[NSString alloc] initWithFormat:@"%@ says: Hello World!", Name]; 
    label.text = Output; 
    [Output release]; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    [textBox resignFirstResponder]; 
    return YES; 
} 
@end 

ответ

1

TextBox должен быть объявлен как свойство, потому что вы @synthesizing его в реализации.

Вам нужно либо:

  1. Добавьте объявление @property для TextBox в интерфейсе.

  2. ИЛИ Вы можете удалить строку @sythesize из своей реализации, если вы не планируете использовать методы setter/getter.

+0

Спасибо за объяснение. Он работал после удаления строки @synthesize. – pdenlinger

1

путем написания @synthesize textBox в вашей реализации компилятор автоматически генерирует 2 метода.

-(UITextField*)textBox 
-(void)setTextBox:(UITextField *)textBox 

Чтобы получить доступ к ним, их необходимо определить в интерфейсе класса. Objective-C для iPhone имеет отличный ярлык для объявления этих двух методов: директивы @property. Вы также можете включить информацию о том, как переменная должна храниться в этой директиве.

@property (nonatomic, retain) IBOutlet UITextField * textBox 

Дал бы вам ваш IBOutlet для текстового поля. Он также поддерживает два вышеперечисленных метода. Он сообщает нам, что textBox сохраняется вашим классом. Всегда используя методы setter и getter для переменной, вы можете избежать освобождения объекта и ссылки на переменную экземпляра позже, когда это может быть небезопасно. Лучше всего это делать. Вы сможете получить доступ к текстовому полю из вашего класса, делая

[self.textBox setText:@"aString"]; 
self.textBox.text = @"aString"; 

(вышеуказанные строки эквивалентны)

+1

Помимо двух аксессуаров, '@ synhesize' также генерирует объявление переменной экземпляра, если у вас нет собственного объявления. Это означает, что как только вы привыкнете к '@ property' и' @ synhesize', вы больше не будете писать свои собственные объявления переменных. – herzbube

Смежные вопросы