我怎样才能在另一堂课中访问IBOutlet?在迅速

时间:2016-02-12 08:46:30

标签: ios swift iboutlet

抱歉,我的英雄技能很差。

我希望在另一个班级中访问IBOutlet。 我在stackoverflow中发现了很多问题,但所有答案都不适用于我的代码

首先这是我的代码。

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
}

}

我希望在这个类中访问ViewController的函数

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()在ViewController的viewDidLoad()中工作 但是具有此设置的SecondViewController中的错误

  

致命错误:在解包可选值时意外发现nil

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

您必须创建视图控制器的对象,然后才能访问它。 例如: -

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

以这种方式访问​​其他视图控制器的变量和函数。

答案 1 :(得分:3)

这是因为ViewController尚未加载。您创建一个变量来临时存储它。当ViewController出现时,在viewDidLoad方法下,将变量分配给IBOutlet。

示例:

FirstViewController中你要传递一个字符串消息说"传递消息"到SecondViewController并显示在IBOutlet的标签上。您无法将字符串直接分配到SecondViewController上的FirstViewController。您必须先创建一个字符串。

当您SecondViewController加载时,在viewDidLoad方法中,分配"传递消息"字符串到要显示的标签。这就是你在IBOutlet上展示的方式。

以防万一:

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

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

在SecondViewController中

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

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

注意:在StoryboardID中分配SecondViewController

答案 2 :(得分:1)

我已将此函数用于以前的类函数操作

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")
        }
    }