2
votes

IBOutlet est nul en Objective C avant la présentation du contrôleur de vue

UIStoryboard *gamePlaySB = [UIStoryboard storyboardWithName:STORYBOARD_GAME_PLAY bundle:nil];
CustomAlertViewController *customAlertVC = [gamePlaySB instantiateViewControllerWithIdentifier:CUSTOM_ALERT_VIEW_CONTROLLER];
I have initialised the viewcontroller as shown above but when trying to access the IBOutlet label from the initialised viewcontroller and set its text, the label is nil.So, I have to pass the value to a variable and then use that in the viewDidLoad to set the title. Is there any other easy way of doing this?

1 commentaires

Vous devez en effet passer par une variable supplémentaire. De plus, s'il y a plusieurs propriétés que vous devez définir, je suggère d'utiliser la classe de modèle "mini": CustomAlertModel par exemple, qui possède toutes les propriétés nécessaires pour mettre à jour les vues dans le ViewController. Pour les propriétés uniques, comme une étiquette, il y avait juste une NSString par exemple.


3 Réponses :


1
votes
CustomAlertViewController *customAlertVC = [gamePlaySB instantiateViewControllerWithIdentifier:CUSTOM_ALERT_VIEW_CONTROLLER];
__unused UIView* view = customAlertVC.view; // this will load everything and call viewDidLoad
customAlertVC.property.text = @"blahblah";
This is if really want to set it from outside. But as per @D. Mika answer, this is not advisable.

0 commentaires

1
votes

Le but d'un ViewController est de gérer les éléments d'une vue. L '"utilisateur" d'un ViewController ne doit pas connaître la structure de la vue et donc les prises utilisées. Par conséquent, je ne considère pas qu'il soit utile que vous souhaitiez accéder aux prises en dehors de ViewController. La manière de fournir les données à afficher via les propriétés du ViewController est courante et également utile.

Par souci d'exhaustivité, il convient de mentionner que vous pouvez forcer le chargement de la vue d'un contrôleur de vue en accédant à la propriété view. Mais, comme je l'ai dit, ce n'est pas une technique appropriée. :-)


0 commentaires

1
votes

J'ai initialisé le contrôleur de vue comme indiqué ci-dessus mais en essayant pour accéder à l'étiquette IBOutlet à partir du contrôleur de vue initialisé et définir son texte, le libellé est nul.

C'est parce que la vue ( UILabel ) n'est pas encore initialisée avant que vous présentiez / poussiez le contrôleur.

Donc, je dois passer la valeur à une variable puis l'utiliser dans le viewDidLoad pour définir le titre. Existe-t-il un autre moyen simple de faire ça?

Oui. Et oui. Si vous déclarez la vue ( UILabel ) paresseusement , vous pouvez directement y passer la valeur, comme ceci:

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 commentaires