IBOutlet равен нулю в Objective C до представления контроллера представления - PullRequest
0 голосов
/ 07 января 2019
UIStoryboard *gamePlaySB = [UIStoryboard storyboardWithName:STORYBOARD_GAME_PLAY bundle:nil];
CustomAlertViewController *customAlertVC = [gamePlaySB instantiateViewControllerWithIdentifier:CUSTOM_ALERT_VIEW_CONTROLLER];

Я инициализировал viewcontroller, как показано выше, но при попытке получить доступ к метке IBOutlet из инициализированной viewcontroller и установить ее текст, метка равна nil.

Итак, я должен передать значение переменной, а затем использовать его в viewDidLoad для установки заголовка. Есть ли другой простой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Целью ViewController является управление элементами представления. «Пользователь» ViewController не должен знать структуру представления и, следовательно, используемые выходы. Поэтому я не считаю полезным, чтобы вы имели доступ к выходам за пределами ViewController. Способ предоставления данных для отображения через свойства ViewController является распространенным и также полезным.

Для полноты картины следует упомянуть, что вы можете принудительно загрузить представление контроллера представления путем доступа к свойству view. Но, как я уже сказал, это не правильная техника. : -)

0 голосов
/ 07 января 2019

Я инициализировал контроллер представления, как показано выше, но при попытке получить доступ к метке 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)
    }
}
0 голосов
/ 07 января 2019
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. Мика ответ, это не рекомендуется.

...