0

这可能听起来很傻,但请继续阅读......

我想从故事板实例化的 aUILabel外部设置 a 的文本。UIViewController我需要确保在设置视图控制器的文本时设置了视图控制器的标签属性,否则将不会设置标签的文本(因为尚未加载它以接收文本值)。

这是我目前的解决方案:

// Show pin entry
if (!self.pinViewController) {
    // Load pin view controller
    self.pinViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"pinScreen"];
    self.pinViewController.delegate = self;
    if (!self.pinViewController.view) {
        // Wait for pin screen to fully load
    }
    [self.pinViewController setMessageText:@"Set a pin for this device"];
}

最初我有一个while循环,直到 is viewnot的值循环nil,但似乎检查视图加载它的行为(如此处所述:http: //developer.apple.com/library/ios/documentation/UIKit/Reference /UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW37 )

我尝试使用该isViewLoaded方法没有成功。它只是永远循环。

我已经将上面的代码作为我当前的解决方案,但感觉不对。

有没有更好的方法确保UIView已加载?

4

3 回答 3

2

我想提出一种替代方法,您不必依赖视图的可用性。
如果你需要等待视图加载,然后才能调用 viewController 上的其他方法,你会破坏封装,因为调用 PinViewController 的 viewController 必须知道 PinViewController 的内部工作。这通常不是一个好主意。

但是你可以在 PinViewController 实例中保存像 NSStrings 这样的对象,当 PinViewController 的视图出现时,你可以根据之前设置的属性设置它的视图。
如果您需要从 viewController 外部更改标签的文本,您还可以创建一个自定义设置器来为您设置 label.text。

你的.h

@interface PinViewController : UIViewController
@property (copy, nonatomic) NSString *messageText;
// ...
@end

还有你的 .m

@implementation PinViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.messageLabel.text = self.messageText;
}

// optional, if you want to change the message text from another viewController:
- (void)setMessageText:(NSString *)messageText {
    _messageText = messageText;
    self.messageLabel.text = messageText;
}

// ...

@end
于 2013-07-04T01:40:51.073 回答
0

我宁愿看到你改变你的逻辑,并按照@MatthiasBauch 在他的回答中显示的方式去做。但是,要回答您的实际问题,您可以简单地设置一个视图属性以强制它加载:

self.pinViewController.view.hidden = NO;
于 2013-07-04T03:14:36.843 回答
0

viewDidLoad我猜应该解决这个问题。

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

于 2013-07-04T01:41:34.513 回答