2016-08-24 6 views
1

J'utilise Swift et je corrige un bug d'iOS 8. J'ai créé un contrôleur de vue avec .xib. Par exemple, un contrôleur de vue et une vue de table.iOS8 Swift ne peut pas créer de contrôleur de vue avec xib

Comment j'ai créé mon fichier .xib.

1.I glisser un tableView dans la vue, enter image description here 2.Réglez la classe du propriétaire du fichier, enter image description here en vue de 3. Faites glisser le propriétaire du fichier enter image description here de l'tableView à 4. Faites glisser le propriétaire enter image description here Et je le code du fichier Mais lorsque je lance cette application dans iOS 8.4 et que j'essaie de présenter ce contrôleur de vue, il va planter. Xcode dit "trouvé de façon inattendue nil tout en déballant une valeur optionnelle". C'est parce que tableView est nul dans ce code. Mais cela fonctionne bien dans iOS 9.

Quelqu'un peut-il m'aider?

+2

et comment voulez-vous créer le viewcontroller lui-même? – ogres

Répondre

0

Définissez les délégués dans la fonction viewWillAppear. Ou dans le constructeur de l'interface. iOS 8 a quelques problèmes de création d'écrans plus tard que nécessaire.

2
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
    let classString = String(describing: type(of: self)) 
    if Bundle.main.path(forResource: classString, ofType: "nib") == nil { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } else { 
     super.init(nibName: nibNameOrNil ?? classString, bundle: nibBundleOrNil) 
    } 
} 
required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

Sur iOS 8, vous devez appeler cette méthode, sur iOS 9 ou version ultérieure, le système corrige ce bogue. Vous pouvez obtenir la réponse here

+0

Est-ce juste moi, ou y a-t-il trop d'accolades de fermeture? Ou est-ce que le formatage est mauvais? – jww

+1

C'est la bonne réponse. Résout le problème. Merci pour ça! – OutOfBounds

1

Tonin déjà fourni la bonne réponse, mais pour tout le monde qui lutte à la conversion de ce Swift 2.3, ici vous allez:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
    let classString = String(MyClassName) 
    if NSBundle.mainBundle().pathForResource(classString, ofType: "nib") == nil{ 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } else { 
     super.init(nibName: nibNameOrNil ?? classString, bundle: nibBundleOrNil) 
    } 
} 

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