iOS с использованием внешнего объекта в Nib - PullRequest
0 голосов
/ 14 сентября 2010

Я пишу приложение, которое должно взаимодействовать с различными бэкэнд-системами. Я решил использовать протокол, чтобы абстрагировать свои бэкэнд-классы. Я создал перо LoginViewController, которое содержит ссылку «Внешний объект» типа «NSObject», и подключил его к выходу systemDelegate в моем LoginViewController.

@interface LoginViewController : UIViewController {

}

@property (nonatomic, retain) IBOutlet UITextField *usernameTextView;
@property (nonatomic, retain) IBOutlet UIImageView *captchaImageView;
@property (nonatomic, retain) IBOutlet UITextField *captchaTextView;
@property (nonatomic, retain) IBOutlet NSObject <BackEndSystemDelegate> *systemDelegate;

- (IBAction) submitCaptcha:(id) sender;
- (IBAction)dismissKeyboard: (id)sender;
- (IBAction) animateViewUp: (id) sender;
- (IBAction) animateViewDown: (id) sender;
- (void) animateViewOnYAxis: (int) offset;
- (void) loadCaptchaImage;

@end

Я создаю экземпляр LoginViewController в моем делегате приложения, затем пытаюсь загрузить перо со ссылкой на внешний объект. Мой код вызывает loadNibNamed и вылетает без трассировки стека. Я не достигаю утверждений NSLog после вызова:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    NSObject <BackEndSystemDelegate> *systemDelegate = [[ACMEBackEndSystemDelegate alloc] init];


    // Init LoginView, and load nib with systemDelegate
    self.viewController = [[LoginViewController alloc] init];
    NSDictionary *proxies = [NSDictionary dictionaryWithObject:systemDelegate forKey:@"systemDelegate"];
    NSDictionary *options = [NSDictionary dictionaryWithObject:proxies forKey:UINibExternalObjects];

    NSArray *toplevelobjects = [[NSBundle mainBundle] loadNibNamed:@"LoginViewController" 
                                                             owner:self.viewController 
                                                           options:options];

    if (toplevelobjects) {
        NSLog(@"toplevelobjects is nil");
    } else {
        NSLog(@"toplevelobjects count %d", [toplevelobjects count]);
    }


    NSLog(@"Controller: %@, View: %@", viewController, viewController.view);

    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}

Я затрудняюсь понять это. Любая помощь будет оценена.

Спасибо, Дж Гарсия

1 Ответ

2 голосов
/ 14 сентября 2010

Несколько комментариев:

  • Обычно вы ссылаетесь на объект делегата, используя шаблон id<SomeProtocolName>, а не NSObject<SomeProtocolName>

  • Вы alloc ваша systemDelegate переменная, но никогда release это. Это утечка памяти.

  • Если класс ACMEBackEndSystemDelegate реализует протокол BackEndSystemDelegate, достаточно выделить его как ACMEBackEndSystemDelegate* systemDelegate = [[ACMEBackEndSystemDelegate alloc] init];

Теперь, что касается вашего сбоя, вы сказали, что в этой строке есть сбой:

NSArray *toplevelobjects = [[NSBundle mainBundle] loadNibNamed:@"LoginViewController" 
                                                             owner:self.viewController 
                                                           options:options];

Я полагаю, у вас есть файл .xib с именем LoginViewController.xib. Откройте это. То есть тип класса установлен для "Владелец файла"? Это LoginViewController? Если нет, установите его. Теперь проверьте свойство view outlet. В .xib установлено значение UIView (возможно, объект верхнего уровня UIView)? Если нет, установите его.

...