抱歉,我的英雄技能很差。
我希望在另一个班级中访问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
我该如何解决这个问题?
答案 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")
}
}