【问题标题】:How to ensure a UIView has loaded?如何确保 UIView 已加载?
【发布时间】:2013-07-04 01:17:33
【问题描述】:

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

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

这是我目前的解决方案:

// 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,但似乎检查视图的行为会加载它(如此处所述:http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW37

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

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

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

【问题讨论】:

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

标签: ios uikit


【解决方案1】:

我想提出一种替代方法,您不必依赖视图的可用性。
如果你需要等待视图加载,然后才能调用 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

【讨论】:

    【解决方案2】:
    【解决方案3】:

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

    self.pinViewController.view.hidden = NO;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多