在调用全局类时无法解包可选

时间:2014-07-12 11:29:23

标签: swift ios8

我的一个班级中有以下代码。

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

    parkCode = tableView.cellForRowAtIndexPath(indexPath).text

    RTATab.codeText.text = parkCode.substringToIndex(3) 
    RTATab.codeLetter.text = parkCode.substringFromIndex(3)
    self.dismissModalViewControllerAnimated(true)
}

上面引用的RTATab是我创建的另一个类(类型UIViewController),在该类中我已将其声明为全局类,如下所示,因为我需要访问一些文本字段( codeTextcodeLetter)在其视野中。

import UIKit
import messageUI
import CoreData
import QuartzCore

var RTATab : ViewController = ViewController()

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {
    //some code
}

运行此操作时,我在行can't unwrap optional.none上收到RTATab.codeText.text = parkCode.substringToIndex(3)错误。

有人可以帮忙。我是否需要在viewController类中使用初始化器?

由于

3 个答案:

答案 0 :(得分:0)

您收到此错误的单元格文本为nil。在调用parkCode上的方法之前,必须先检查它是否为nil:

let possibleParkCode = tableView.cellForRowAtIndexPath(indexPath).text
if let parkCode = possibleParkCode {
    RTATab.codeText.text = parkCode.substringToIndex(3) 
    RTATab.codeLetter.text = parkCode.substringFromIndex(3)
}

答案 1 :(得分:0)

parkCodeRTATab.codeText不存在(nil)。您需要在解除引用其中任何一个之前检查它们的存在。

override func tableView (tableView: ...) {
  if let theParkCode = tableView.cellForRowAtIndexPath(indexPath).text {
    parkCode = theParkCode;
    if let theCodeText = RTATab.codeText {
       theCodeText.text = parkCode?.substringToIndex(3)
    }
    if let theCodeLetter ... {
    // ...
    }
  }
}

注意:上面的代码取决于ViewControllerRTATab的类)如何为codeTextcodeLetter声明其实例变量 - 我假设作为选择。

答案 2 :(得分:0)

您收到错误是因为RTATab.codeTextRTATab.codeLetternil - 您初始化RTATab的方式实际上并未将其属性与故事板中的文本字段。如果您真的只需要全局版本的视图控制器,则需要为其提供一个故事板ID并使用以下内容加载它:

var RTATab: ViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("RTA") as ViewController

但是,我的猜测是它是你已经在其他地方显示过的想要更新的视图控制器,在这种情况下你最好只设置一个可以保存“parkCode”值并拉出它们的数据结构在显示它们的时候回到正确的视图控制器。