2012-04-08 5 views
3

Как заменить раскадровку на XIB?Замена раскадровки на XIB

При попытке создать динамические представления и их контроллеры я потерял все преимущества новой раскадровки. Теперь, пытаясь удалить его из проекта, я создал новый XIB со своим собственным контроллером и заменил его в настройках проекта:

Теперь при попытке запуска приложения он выходит из строя, и журнал показывает мне следующее :

2012-04-08 14:50:16.567 Bazaart[11340:15203] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIApplication 0x8c15c20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.' 

Вот код: UIRootWindow:

#import <UIKit/UIKit.h> 
@interface UIRootWindow : UIViewController 
@end 

И его соответствующая реализация:

#import "UIRootWindow.h" 
@implementation UIRootWindow 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    return self; 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 
@end 

EDIT:
У меня есть окно, предложенное Филлипом (см. Ниже). Но ... как я это делал, это не самое лучшее. Правильно ли я это делаю?

UIRootWindow *wnd = [[UIRootWindow alloc] init]; 
[wnd view]; 
[self setWindow:wnd.window]; 
+2

Просто обратите внимание, что для будущей совместимости вы не должны запускать свои собственные имена классов с помощью 'UI' или' NS' (представьте, что в будущей версии SDK Apple вводит новый класс под названием 'UIRootWindow'). Используйте свои собственные префиксы, так что у вас будет что-то вроде 'URKRootWindow'. –

ответ

7

Не помещайте ничего в поле основного интерфейса. Вместо этого загрузите контроллеры верхнего уровня в метод didFinishLaunchingWithOptions: добавьте делегат приложения и установите корневой контроллер окна.

При запуске приложения предполагается, что упоминаемый там xib имеет владельца файла, который является UIApplication. (Старые шаблоны, используемые для этого, и некоторые примеры проектов по-прежнему.)

+0

Спасибо. Это сработало. Хотя, они, как я приложил окно, не оптимальны, похоже. Есть лучший способ сделать это? – UrK

+0

Я предлагаю создать совершенно новое тестовое приложение с использованием шаблона контроллера единого вида (без раскадровки) и посмотреть, как они настраивают содержимое делегата приложения. В принципе, вы хотите, чтобы ваш первый контроллер (или содержащий его контроллер, если он есть) назначался «window.rootViewController» делегата. –

+0

Спасибо. Это определенно ответил на мой вопрос. Должен был подумать об этом сам. – UrK

0

Когда ваше приложение запускается, каждый контроллер в вашем XIB создается на основе имени класса, который вы установили. Затем каждое свойство, которое вы визуализировали визуально, устанавливается с помощью KVC. Ошибка говорит вам, что где-то в этом процессе свойство «view» неверно.

я могу думать о двух причин, почему это может происходить:

  • Вы не имеете право класс набор для ViewController или другой объект в XIB (в «Удостоверение инспектора»)
  • Вы не правильно подключили соединения. (В «Инспекторе соединений»)

В любом случае вы можете быстро выполнить настройки в своем XIB, указав, где подключен объект «вид».