2016-02-12 1 views
0

Je suis désolé d'avoir mauvaise compétence eng.Comment puis-je accéder à IBOutlet dans une autre classe? en rapide

Je veux accéder à IBOutlet dans une autre classe. J'ai trouvé beaucoup de questions dans stackoverflow, mais toutes les réponses ne marchent pas dans mon code

d'abord ceci est mon code.

ViewController.swift

import UIKit 

class ViewController: UIViewController { 

@IBOutlet var MainViewController: UIView! = nil 
@IBOutlet var LyricsViewController: UIView! = nil 
@IBOutlet var ListViewController: UIView! = nil 
override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    showMainViewController()  
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func showMainViewController(){ 
    MainViewController.alpha = 1 
    LyricsViewController.alpha = 0 
    ListViewController.alpha = 0 
} 
func showLyricsViewController(){ 
    MainViewController.alpha = 0 
    LyricsViewController.alpha = 1 
    ListViewController.alpha = 0 
} 
func showListViewController(){ 
    MainViewController.alpha = 0 
    LyricsViewController.alpha = 0 
    ListViewController.alpha = 1 
} 

} 

et je veux accéder à la fonction de ViewController dans cette classe

SecondViewController.swift

import UIKit 

class SecondViewController : UIViewController{ 

@IBOutlet weak var menuButton: UIButton! 
var listBoolean = false 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

@IBAction func LinkListView(sender: AnyObject) { 

    if(listBoolean == false){ 
     ViewController().showListViewController() 
     listBoolean = true 
    } 
    else{ 
     ViewController().showMainViewController() 
     listBoolean = false 

    } 

} 

} 

func showMainViewController() est le travail dans viewDidLoad ViewController() mais erreur dans SecondViewController avec ce setance

d'erreur fatale: de façon inattendue trouvé nulle en déballant une valeur facultative

comment puis-je résoudre ce problème?

+1

Juste un conseil sans rapport avec la question: n'appelez pas une variable '...viewController' s'il s'agit d'un objet 'UIView', et commence toujours par un nom de variable ou de méthode avec une minuscule afin d'éviter toute confusion avec le nom des classes. –

Répondre

3

Cela est dû au fait que ViewController n'est pas encore chargé. Vous créez une variable pour la stocker temporairement. Lorsque le ViewController apparaît, sous votre méthode viewDidLoad, affectez la variable à l'IBOutlet.

Exemple:

Dans le FirstViewController vous voulez passer un message de chaîne dire « passer un message » à SecondViewController et l'affichage sur une étiquette de IBOutlet. Vous ne pouvez pas affecter la chaîne directement à SecondViewController au FirstViewController. Vous devez d'abord créer une chaîne. Lorsque votre SecondViewController charge, dans la méthode viewDidLoad, affectez la chaîne "message de réussite" à l'étiquette à afficher.

C'est ainsi que vous affichez votre IBOutlet.

Juste au cas où:

class FirstViewController: UIViewController{ 
// All your above codes. 

func PassMessage(){ 
    let displayViewController = storyboard!.instantiateViewControllerWithIdentifier("SecondViewController") as! SecondViewController 
    displayViewController.message = "pass message" 
    } 
} 

Dans SecondViewController

class SecondViewController: UIViewController{ 
@IBOutlet weak var displayLabel: UILabel! 
var message = "" 

override func viewDidLoad(){ 
    super.viewDidLoad() 
    self.displayLabel.text = message 
    } 
} 

Note: Assigner SecondViewController dans le StoryboardID.

+0

Je suis très désolé je ne peux pas comprendre votre réponse parce que j'ai la compétence dev inférieure. puis-je obtenir le code d'exemple ?? –

+0

J'ai modifié ma réponse. Vous devriez comprendre maintenant. – jo3birdtalk

+0

Je suis désolé j'ai toujours une erreur. mais je suis très merci pour votre réponse –

1

J'ai utilisé cette fonction pour les opérations de fonction de la classe précédente

let appdel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let nav : UINavigationController! = window.rootViewController as! UINavigationController 

for(var i:Int = 0 ; i < nav.viewControllers.count ; i++) 
    { 
     let viewc : UIViewController = nav.viewControllers[i] 
     if(viewc.respondsToSelector("showListViewController")) 
     { 
      viewc.performSelector("showListViewController") 
     } 
    } 
4

Vous devez créer un objet de contrôleur de vue et y accéder. Ex: -

var dash : abcViewController = storyBoard.instantiateViewControllerWithIdentifier("abc") as! abcViewController 
var a = dash.getXYZ() 

Comme cette façon, vous accédez à la variable et la fonction d'un autre contrôleur de vue.