Ios 如何确保已加载UIView?

Ios 如何确保已加载UIView?,ios,uikit,Ios,Uikit,这听起来可能很傻,但请继续阅读 我想从故事板实例化的UIViewController外部设置UILabel的文本。我需要确保在设置视图控制器的文本时设置了其label属性,否则将不会设置标签的文本(因为它尚未加载以接收文本值) 以下是我当前的解决方案: // Show pin entry if (!self.pinViewController) { // Load pin view controller self.pinViewController = [self.storybo

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

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

以下是我当前的解决方案:

// 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
循环,循环直到
view
的值不是
nil
,但检查视图的行为似乎会加载它(如本文所述:)

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

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


是否有更好的方法确保加载了
UIView

我想提出一种不必依赖视图可用性的替代方法。
如果在调用viewController上的其他方法之前需要等待视图加载,则会破坏封装,因为调用PinViewController的viewController必须了解PinViewController的内部工作原理。这通常不是个好主意

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

你的

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

@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

viewDidLoad
应该可以解决这个问题


我宁愿看到你改变你的逻辑,按照@MatthiasBauch在回答中所展示的方式来做。但是,要回答实际问题,只需设置视图属性以强制加载:

self.pinViewController.view.hidden = NO;

如果操作正确,
viewController.view
将永远不会为
nil
,因为如果尚未创建视图,getter将创建该视图