在呈现视图控制器之前,IBOutlet在Objective C中为零

时间:2019-01-07 10:00:21

标签: ios objective-c viewcontroller iboutlet presentation

UIStoryboard *gamePlaySB = [UIStoryboard storyboardWithName:STORYBOARD_GAME_PLAY bundle:nil];
CustomAlertViewController *customAlertVC = [gamePlaySB instantiateViewControllerWithIdentifier:CUSTOM_ALERT_VIEW_CONTROLLER];

我已经如上所述初始化了viewcontroller,但是当尝试从初始化的IBOutlet访问viewcontroller标签并设置其文本时,标签为nil。

因此,我必须将值传递给变量,然后在viewDidLoad中使用它来设置标题。还有其他简便的方法吗?

3 个答案:

答案 0 :(得分:1)

ViewController的目的是管理视图的元素。 ViewController的“用户”不应该知道View的结构,因此也不知道所使用的插座。因此,我认为访问ViewController外部的插座对您没有用。 通过ViewController的属性提供要显示的数据的方法很常见,也很有用。

为了完整起见,应该提到您可以通过访问view属性来强制加载视图控制器的视图。但是,正如我所说,这不是一种适当的技术。 :-)

答案 1 :(得分:1)

  

我已经如上所述初始化了视图控制器,但是在尝试时   从初始化的视图控制器访问IBOutlet标签,并   设置其文本,标签为nil。

这是因为在显示/推动控制器之前,视图(UILabel)尚未初始化。

  

因此,我必须将值传递给变量,然后在   viewDidLoad设置标题。还有其他简便的方法吗   这个吗?

是的。是的。如果要懒惰声明视图(UILabel),则可以直接在其中传递值,就像这样:

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let vc2 = VC2()
        vc2.label.text = "HELLO"
        self.present(vc2, animated: true, completion: nil)
    }
}

class VC2: UIViewController {

    lazy var label: UILabel = {
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 30))
        label.textColor = .gray
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = .red

        self.view.addSubview(self.label)
        self.label.center.equalTo(self.view.center)
    }
}

答案 2 :(得分:0)

CustomAlertViewController *customAlertVC = [gamePlaySB instantiateViewControllerWithIdentifier:CUSTOM_ALERT_VIEW_CONTROLLER];
__unused UIView* view = customAlertVC.view; // this will load everything and call viewDidLoad
customAlertVC.property.text = @"blahblah";

这是如果真的要从外部进行设置。但是按照@D。米卡回答,这是不可取的。