![](/img/trans.png)
[英]How to dismiss a presented view controller when using UIAlertViewController in objective c?
[英]IBOutlet are nil in Objective C before the view controller is presented
UIStoryboard *gamePlaySB = [UIStoryboard storyboardWithName:STORYBOARD_GAME_PLAY bundle:nil];
CustomAlertViewController *customAlertVC = [gamePlaySB instantiateViewControllerWithIdentifier:CUSTOM_ALERT_VIEW_CONTROLLER];
我已经如上所示初始化了viewcontroller
,但是当尝试从初始化的viewcontroller
访问IBOutlet
标签并设置其文本时,标签为零。
所以,我必须将该值传递给一个变量,然后在viewDidLoad
使用它来设置标题。 有没有其他简单的方法可以做到这一点?
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。 米卡回答,这是不可取的。
ViewController 的目的是管理视图的元素。 ViewController 的“用户”不应该知道 View 的结构,因此不应该知道使用的出口。 因此,我认为您想要访问 ViewController 之外的出口是没有用的。 通过 ViewController 的属性提供要显示的数据的方式很常见,也很有用。
为了完整起见,应该提到您可以通过访问 view 属性来强制加载视图控制器的视图。 但是,正如我所说,这不是一种适当的技术。 :-)
我已经如上所示初始化了视图控制器,但是当尝试从初始化的视图控制器访问 IBOutlet 标签并设置其文本时,标签为零。
那是因为在您呈现/推送控制器之前,视图 ( 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)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.