[Résolu] Initialiser un UIViewController

busterTheobusterTheo Membre
octobre 2015 modifié dans API UIKit #1

Bonjour,


je suis tombé là -dessus.


 


 


Est-ce qu'il faut donc placer ce code dans tous les fichiers viewControllers ?


 


Et si oui, faut-il remplacer le "subview = UIView()" (dans override init)par tous nos objets créés ?


 


Exemple de mes objets créés :



var patientsViewController: PatientsViewController?
var etape0ViewController: Etape0ViewController!
var etape1ViewController: Etape1ViewController!
var etape1L1ViewController: Etape1L1ViewController!
var contentEtapesViewController: ContentEtapesViewController!

D'ailleurs, chez moi, c'est cela qui fonctionne sans planter



required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
// subview = UIView()
super.init(nibName: nil, bundle: nil)
}

convenience init() {
self.init(nibName: nil, bundle: nil)
}

Merci


Réponses

  • AliGatorAliGator Membre, Modérateur
    Heu très bizarre ton article que tu as cité.

    En effet je vois pas pourquoi il écrit la ligne "subview = UIView()" (je vois pas d'où elle sort, ce qu'il veut faire avec, pourquoi ça serait obligatoire... pas très clair son truc)... en plus c'est bizarre d'overrider "init(nibName:... bundle:...)" en appelant "super"... mais sans lui faire suivre les paramètres (ni nibNameOrNil, ni nibBundleOrNil) et en forçant "nil" pour les 2... ça risque pas trop de marcher...

    Non franchement, je me fierais pas trop à  cet article qui me semble bizarre.

    Mais de toute façon, cet article date de Août 2014. Et parle donc des toutes toutes premières version de Swift (version initiale beta 4), et énormément de choses ont changé depuis, déjà  entre la beta 4 de Août 2014 et la 1.2 officiellement supportée par le dernier Xcode non-beta, et encore d'autres choses changent avec Swift 2.0 introduit dans Xcode 7 beta... donc cet article n'est plus vraiment d'actualité je pense.
  • Ah, merci AliGator.


     


    Je me rend compte que dans certaines de mes classes (celles qui dessinent, un rond, une ligne, un trait, etc. avec override func drawRect(rect: CGRect)), j'ai ce code :



    class FullLine: UIView {

    override init(frame: CGRect) {
    super.init(frame: frame)
    self.backgroundColor = UIColor.clearColor()
    }

    required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }
    .....
    }

    Est-ce nécessaire de le conserver, et si oui, est-ce nécessaire de le placer dans toutes mes petites classes de dessin ?


     


    Merci d'avance.


  • C'est le init(coder:) qui te pose problème ? Il ne sert pas à  grand chose dans ton cas, mais le compilateur hurle si on l'efface. Alors garde-le !

  • AliGatorAliGator Membre, Modérateur

    Est-ce nécessaire de le conserver, et si oui, est-ce nécessaire de le placer dans toutes mes petites classes de dessin ?

    Tu parles de quoi par "le conserver" ? le "initWithCoder:" ? C'est mieux quand même tant qu'à  faire (surtout pour des UIView) de l'implémenter, car c'est cette méthode qui est appelée pour créer ton UIView si elle est utilisée dans un XIB ou un Storyboard (et pas créée par code).

    Donc le fait d'implémenter "initWithCoder" avec ce code fatalError va faire que tu ne vas pas pouvoir utiliser ta classe FullLine directement dans un XIB, c'est dommage.

    Le mieux c'est de l'implémenter, et dans son code d'affecter toutes les propriétés que tu pourrais avoir qui ne seraient pas modifiables directement depuis IB (et d'appeler super aussi).

    Par exemple quand ta classe FullLine est initialisée avec initWithCoder, donc qu'elle vient d'un XIB ou d'un Storyboard, tu as pu changer la valeur de sa backgroundColor depuis IB quand tu l'as mise, donc pour cette propriété c'est sans doute pas très logique de la forcer à  clearColor dans le initWithCoder, car sinon ça pourrait faire bizarre : imagines dans IB tu lui mets via le panneau d'inspecteur à  droite la couleur rouge en backgroundColor, et tu te retrouves avec une clearColor alors que t'as demandé du rouge, ça semblerait pas conséquent...
    Par contre si tu as une autre propriété qui ne peut pas être changée par IB, genre un "isDashLine" pour indiquer s'il faut dessiner des pointillés ou un trait continu, là  tu vas lui donner une valeur par défaut dans ton initWithCoder car tu n'auras pas pu la changer via IB.

    Car en fait ce que fait initWithCoder c'est qu'il initialise ton instance de FullLine... en donnant la bonne valeur à  tous les paramètres qui ont été spécifiés dans IB pour cette instance, donc tout ce que tu as réglé via IB, le super.initWithCoder se charge de leur attribuer la valeur que tu as mis dans le XIB (comme la backgroundColor par exemple), mais pour le reste qui ne pourra pas être déduit de IB, il faut quand même bien que tu prévois de donner des valeurs par défaut.
  • Les UIViews en question (des ronds, des lignes, etc.) ne sont appelées uniquement dans mon code.


     


    Je n'ai rien dans mon IB.

Connectez-vous ou Inscrivez-vous pour répondre.