实例化后设置ViewController的属性

时间:2009-04-15 03:43:38

标签: objective-c properties

我正在创建一个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];

但无济于事..

我不知道为什么我不能在boyViewController中设置UILabel“sign”的text属性..

2 个答案:

答案 0 :(得分:6)

这里的问题是初始化程序实际上并没有将nib文件加载到内存中。相反,加载nib会延迟,直到您的应用程序请求视图控制器的view属性。因此,当您访问它时,控制器的sign属性为null。

手动请求控制器的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 :(得分:1)

您是否在Interface Builder上绑定了您的商店?

您似乎需要将第一个示例的符号插件绑定到Interface Builder中,以便将该文本实际设置为您想要的任何内容。

在Interface Builder中将插座绑定到实际的UI组件后,您应该可以执行以下操作:

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

This是您需要了解的关于绑定的内容。

你的第二个例子对我来说根本没有意义。