Toutes mes excuses si cela a été demandé auparavant, j'ai beaucoup cherché et de nombreuses réponses proviennent de versions bêta précédentes de Swift lorsque les choses étaient différentes. Je n'arrive pas à trouver une réponse définitive.
Je veux sous UIViewController
- classer et avoir un initialiseur personnalisé pour me permettre de le configurer facilement dans le code. J'ai du mal à faire ça dans Swift.
Je veux une init()
fonction que je peux utiliser pour passer une fonction spécifique que NSURL
je vais ensuite utiliser avec le contrôleur de vue. Dans mon esprit, cela ressemble à quelque chose init(withImageURL: NSURL)
. Si j'ajoute cette fonction, il me demande alors d'ajouter la init(coder: NSCoder)
fonction.
Je crois que c'est parce qu'il est marqué dans la superclasse avec le required
mot-clé? Alors je dois le faire dans la sous-classe? Je l'ajoute:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Maintenant quoi? Mon initialiseur spécial est-il considéré comme un convenience
un? Un désigné? Dois-je appeler un super initialiseur? Un initialiseur de la même classe?
Comment ajouter mon initialiseur spécial à une UIViewController
sous-classe?
la source
Réponses:
la source
ViewController()
,ViewController(imageURL: url)
ou de le charger d'un story - board.required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
sinon,super.init(coder: aDecoder)
j'obtenais l'erreur de propriétéself.someProperty
non initialisée à l'super.init
appelinit(coder: aDecoder)
. LafatalError
volonté suffiraPour ceux qui écrivent l'interface utilisateur dans le code
la source
Ceci est très similaire aux autres réponses, mais avec quelques explications. La réponse acceptée est trompeuse car sa propriété est facultative et n'expose pas le fait que votre
init?(coder: NSCoder)
DOIT initialiser chaque propriété et la seule solution à cela est d'avoir unfatalError()
. En fin de compte, vous pourriez vous en sortir en rendant vos propriétés optionnelles, mais cela ne répond pas vraiment à la question du PO.Vous devez essentiellement ABANDON le charger à partir du storyboard. Pourquoi?
Parce que quand vous appelez un viewController
storyboard.instantiateViewController(withIdentifier: "viewController")
alors UIKit fera sa chose et appelVous ne pouvez jamais rediriger cet appel vers une autre méthode init.
Pourtant, pour les viewController créés par programme ou les viewControllers créés par nib, vous pouvez rediriger cet appel comme indiqué ci-dessus.
la source
Ils sont documentés ici .
la source
Si vous avez besoin d'un init personnalisé pour un popover par exemple, vous pouvez utiliser l'approche suivante:
Créez un init personnalisé qui utilise le super init avec nibName et bundle, puis accédez à la propriété view pour forcer le chargement de la hiérarchie de vues.
Ensuite, dans la fonction viewDidLoad, vous pouvez configurer les vues avec les paramètres passés lors de l'initialisation.
la source