ios - 在 UIViewController 中的何处设置属性

标签 ios objective-c uiview properties uiviewcontroller

一个我不确定的相当基本的问题。我通常在 viewDidLoad 中设置我的 UIViewController 的 View 相关代码。如果 Controller 具有标签等的某些属性,我将在这里初始化它们并将它们添加到 View 中。这些属性通常在 .m 中声明,因此可以被视为伪私有(private)的。

但是 - 如果 Controller 在其头文件中公开这些属性之一(比方说 UILabel),我发现在设置它时我不能依赖它的存在向上。例如:

CustomViewController *controller = [CustomViewController alloc] initWithNibName:nil bundle:nil];
controller.someLabel.text = @"label text goes here";
//then comes the presentation code

我发现我设置标签文本的时间过早 - viewDidLoad 尚未触发,因此标签为 nil。

我应该在 init 中创建这个标签并将其添加到 viewDidLoad 中吗?我应该在 init 中进行所有设置吗?或者也许所有 View 属性的初始化?还是具体情况具体判断?

或者根本原因可能是我不应该让 Controller 公开 View (标签)并使用其他模式?

我正在寻找一种一致的方式来构建我的代码。

最佳答案

是的,你已经很正确了。问题是,在实际呈现 View 之前,不会加载 Controller 的所有 View 组件。因此,您无法从 Controller 外部设置任何 IBOutlets。

例如,传递 UILabel 的文本的一种方法是创建一个新的字符串属性,比方说 self.myString,从外部分配它,并在您的 viewDidLoad 中设置标签的文本此属性。

CustomViewController *controller = [CustomViewController alloc] initWithNibName:nil bundle:nil];
controller.myString = @"label text goes here";

CustomViewController 中:

- (void)viewDidLoad
{
    [super viewDidLoad];

    (...)
    self.label.text = self.myString;
}

关于ios - 在 UIViewController 中的何处设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477587/

相关文章:

ios - 如何使用适用于 iOS 的 Google Maps SDK 检测点在多边形内?

ios - 避免 Swift 同时调用 viewDidLoad 方法得到 "Index out of range"

ios - 如何使用 UIView 创建自定义翻转动画

ios - FMResultSet 在另一个 ViewController 中返回 nil

ios - CGBitmapContextCreateImage 内存泄漏

objective-c - 在 Objective C 中使用正则表达式从 url 获取 Vimeo Clip_id

iphone - 在另一个类中使用一个类的对象

ios - dispatch_async 中的 dispatch_sync

ios - 使用 swift 以编程方式更改 View 的高度和宽度会导致 iOS 出现意外行为

ios - Swift - 屏幕更新后 - UIView 到 UIImage 的转换