2017-03-13 2 views
0

Après la mise en œuvre suivantes (héritage de classe):Comment laisser un UIViewController hériter d'un autre IBOutlets UIViewController?

class UIViewControllerA: UIViewControllerB { 
} 

Comment laisser UIViewControllerA à UIViewControllerB IBOutlets hérite? Comment puis-je connecter les composants de Storyboard à la sous-classe UIViewControllerA?

+0

L'héritage est une fonctionnalité de langage de programmation, elle n'est pas liée au storyboard, quel est exactement le problème? –

+0

quand je m'utilise. label dans UIViewControllerA, il est nul, tous les contrôles sont nuls – keen

+0

Par défaut, si vous les implémentez comme IBOutlets, ils devraient être 'nil' par défaut, sauf si vous les connectez depuis le storyboard. –

Répondre

1

Si votre objectif est de laisser IBOutlets à être héritée, vous devez effectuer les opérations suivantes:

1- Ajouter les IBOutlets dans la classe Super:

Super classe (UIViewController) ne devrait pas être directement connecté à un ViewController au storyboard, il devrait être générique. Lors de l'ajout des IBOutlets à la super classe, ils ne devraient être connectés à aucun composant, les sous-classes devraient le faire. Aussi, vous pourriez vouloir faire un peu de travail (c'est pourquoi vous devriez appliquer ce mécanisme) pour les IBOutlets de la super classe.

classe Super devrait être similaire à:

class SuperViewController: UIViewController, UITableViewDataSource { 
    //MARK:- IBOutlets 
    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var label: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // setting text to the label 
     label.text = "Hello" 

     // conforming to table view data source 
     tableView.dataSource = self 
    } 

    // handling the data source for the tableView 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 10 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") 

     cell?.textLabel?.text = "Hello!" 

     return cell! 
    } 
} 

2- Hériter classe Super et connecter le IBOutlets:

Simplement, votre sous-classe devrait être similaire à:

class ViewController: SuperViewController { 
    override func viewDidLoad() { 
     // calling the super class version 
     super.viewDidLoad() 
    } 
} 

À partir du storyboard, affectez le contrôleur de vue à ViewController (sous-classe), puis reconstruisez le projet (cmd + b).

Maintenant, après avoir sélectionné le contrôleur de vue et en sélectionnant « Inspecteur de connexion », vous devriez voir -dans les IBOutlets Section-:

enter image description here

vous pouvez les connecter manuellement aux composants de l'interface utilisateur qui existe dans votre sous-classe ViewController (faites glisser du cercle vide vers le composant). ils devraient ressembler à:

enter image description here

Et voilà! La vue et l'étiquette de la table de votre sous-classe doivent hériter de ce qui est inclus dans la super classe.

J'espère que cela a aidé.

+0

Merci pour votre réponse.J'ai résolu hier de votre réponse: Par défaut si vous les implémentez comme IBOutlets, ils devraient être nuls par défaut , sauf si vous les connectez depuis le storyboard. – keen

+0

Content de vous aider :) Oui, les IBOutlets sont nuls par défaut, sauf si vous les connectez depuis le storyboard. –