Установка свойств ViewController после создания экземпляра - PullRequest
1 голос
/ 15 апреля 2009

Я создаю экземпляр viewController, а затем пытаюсь установить текст его свойств, UILabel.

BoyController *boyViewController = [[BoyController alloc] initWithNibName:@"BoyView" bundle:nil];
        NSString *newText = [astrology getSignWithMonth:month   withDay:day];
        boyViewController.sign.text = newText;
        NSLog(@" the boyviewcontroller.sign.text is now set to: %@", boyViewController.sign.text);
        [newText release];

Я попробовал это, но это не сработало ...

Итак, я попробовал следующее:

BoyController *boyViewController = [[BoyController alloc] initWithNibName:@"BoyView" bundle:nil];
    UILabel *newUILabel = [[UILabel alloc] init];
    newUILabel.text = [astrology getSignWithMonth:month withDay:day];
    boyViewController.sign = newUILabel;
    NSLog(@" the boyviewcontroller.sign.text is now set to: %@", newUILabel.text);
    [newUILabel release];

Но безрезультатно.

Я не уверен, почему не могу установить свойство text знака UILabel в boyViewController ..

Ответы [ 2 ]

6 голосов
/ 01 июня 2010

Проблема здесь в том, что инициализатор фактически не загружает файл пера в память. Вместо этого загрузка пера задерживается до тех пор, пока ваше приложение не запросит свойство контроллера вида view. Таким образом, свойство sign вашего контроллера имеет нулевое значение, когда вы обращаетесь к нему.

Ручной запрос свойства view контроллера заставит ваш пример работать ...

BoyController *boyViewController = [[BoyController alloc] initWithNibName:@"BoyView" bundle:nil];

[boyViewController view]; // !!!: Calling [... view] here forces the nib to load.

NSString *newText = [astrology getSignWithMonth:month   withDay:day];
boyViewController.sign.text = newText;
// and so on...

Однако я думаю, что вы действительно пытаетесь создать и настроить свой контроллер представления, прежде чем освободить его для выполнения своих собственных задач. (Возможно, чтобы отобразить это модально, скажем.) Ручной вызов [... view] не будет долгосрочным решением.

Лучше установить отдельное свойство в вашем контроллере представления для текста метки, а затем реализовать viewDidLoad, чтобы присвоить его метке:

@interface BoyViewController : UIViewController {
    IBOutlet UILabel *label;
    NSString *labelText;
}
@property(nonatomic, copy)NSString *labelText;
@end

@implementation
@synthesize labelText;

- (void)viewDidLoad
{
    [label setText:[self labelText]];
}

// and so on...

@end

Это дает дополнительное преимущество, так как текст метки сбрасывается в случае очистки представления во время события нехватки памяти.

1 голос
/ 15 апреля 2009

Вы связали свои розетки в Интерфейсном Разработчике?

Похоже, вам нужно привязать знак розетки первого примера в Интерфейсном Разработчике, чтобы фактически установить этот текст на то, что вы хотите.

Как только вы подключите свою розетку к фактическому компоненту пользовательского интерфейса в Интерфейсном Разработчике, вы сможете сделать что-то вроде:

NSString *newText = [astrology getSignWithMonth:month withDay:day];
[[boyViewController sign] setText:newText];

Это - это то, что вам нужно знать о связывании.

Ваш второй пример не имеет никакого смысла для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...