iPhone: вид, который является свойством, не появляется после добавления директивы @synthesize для свойства - PullRequest
1 голос
/ 02 марта 2010

У меня есть mainwindow.xib, у которого есть контроллер панели вкладок. Первая вкладка имеет вид, который загружается из «View1.xib». В моем View1.xib я перетаскиваю элемент пользовательского интерфейса. Это есть в .h:

#import <UIKit/UIKit.h>
@class View1Controller;


@interface View1Controller : UIViewController {
    IBOutlet UIView *view;
    IBOutlet UIButton *startButton;
}

@property (retain, nonatomic) UIView *view;
@property (retain, nonatomic) UIButton *startButton;


-(IBAction)startClock:(id)sender;

@end

В файле .m я ничего не делаю. Будет вести себя нормально. Я вижу вид и его кнопку. Но после того, как я добавлю:

@synthesize view, startButton;

Когда я загружаю приложение, оно показывает пустой вид без кнопки, но не выдает ошибок. Что происходит?

Ответы [ 2 ]

2 голосов
/ 02 марта 2010

Основная проблема в том, что UIViewController уже имеет свойство view. Когда вы переопределяете его в подклассе UIViewController, вы перезаписываете это свойство представления. Честно говоря, я удивлен, что это даже компилируется.

Исправить:

(1) Сначала спросите себя, нужно ли вам вообще другое свойство представления, кроме унаследованного. Если вам нужен только один вид для контроллера, просто используйте унаследованное свойство.

(2) Если вам нужна ссылка на второй вид, назовите его так:

#import <UIKit/UIKit.h>
//@class View1Controller; <-- don't forward declare a class in its own header


@interface View1Controller : UIViewController {
    // IBOutlet UIView *view; <-- this is inherited from UIViewController
    IBOutlet UIView *myView;
    IBOutlet UIButton *startButton;
}
//@property (retain, nonatomic) UIView *view; <-- this is inherited from UIViewController
@property (retain, nonatomic) UIView *myView;
@property (retain, nonatomic) UIButton *startButton;


-(IBAction)startClock:(id)sender;

@end

затем в реализации:

//@synthesize view; <-- this is inherited from UIViewController
@synthesize myView, startButton;
1 голос
/ 02 марта 2010

Проблема в том, что вы объявили переменные view и startButton как IBOutlets. Это означает, что Interface Builder привязывает эти переменные непосредственно из файла XIB.

Определенные вами свойства не являются IBOutlets. Когда вы их синтезируете, вы перезаписываете методы получения / установки, и Interface Builder больше не может с ними связываться.

Чтобы исправить вашу проблему, удалите спецификатор IBOutlet из ваших переменных-членов и измените объявления свойств следующим образом:

@property (retain, nonatomic) IBOutlet UIView *view;
@property (retain, nonatomic) IBOutlet UIButton *startButton;
...