Swift Can';调用全局类时不展开可选

Swift Can';调用全局类时不展开可选,swift,ios8,Swift,Ios8,我的一个类中有以下代码 override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { parkCode = tableView.cellForRowAtIndexPath(indexPath).text RTATab.codeText.text = parkCode.substringToIndex(3) RTATab.codeL

我的一个类中有以下代码

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
),在该类中,我将其声明为如下所示的全局类,因为我需要访问其视图中的一些文本字段(
codeText
coderetter

import UIKit
import messageUI
import CoreData
import QuartzCore

var RTATab : ViewController = ViewController()

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {
    //some code
}
当我运行此操作时,我得到一个
无法展开可选。行
RTATab.codeText.text=parkCode.substringToIndex(3)
上无
错误

有人能帮忙吗。我需要在viewController类中使用初始化器吗


谢谢

您收到此错误,单元格文本为
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)
}

parkCode
RTATab.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 ... {
    // ...
    }
  }
}

注意:上面的代码取决于
ViewController
RTATab
类)如何为
codeText
coderetter
声明其实例变量-我假设为可选变量

出现错误是因为
RTATab.codeText
RTATab.codeLetter
nil
——初始化
RTATab
的方式实际上并没有将其属性与情节提要中的文本字段链接起来。如果您确实需要视图控制器的全局版本,则需要为其提供一个情节提要ID,并使用如下方式加载:

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

然而,我的猜测是,您已经在别处显示了一个视图控制器,您想要更新它,在这种情况下,您最好只设置一个可以保存“parkCode”的数据结构值,并在需要显示时将其拉回到正确的视图控制器中。

parkCode是如何定义的?用大写字母命名变量(特别是“RTATab”)是不习惯的;大写字母为“保留”类型。它使“RTATab.codeText”的使用看起来像是对类变量的引用。parkCode定义为var parkCode:NSString?=“无代码”是,我正在将数据发送回另一个视图控制器并更新文本字段。现在我已经在视图控制器中创建了一个结构,并且能够传递数据。但是,当我尝试使用这些值来更新文本字段时,它在我使用文本字段的行上给了我相同的错误…任何想法?都不起作用。当我执行println时,会显示值。因此,不确定从何处提取此错误。代码字母声明为:“@IBOutlet var codeLetter:UITextField”。当我执行println语句时,parkCode确实显示一个值。意味着它不是零对吗?如上面所述尝试了if语句,其中的代码确实得到了执行。然而,当我尝试分配给textfield时,会出现相同的错误。因此,基本上,分配给另一个变量是有效的,但当分配给文本字段时,它会给我一个无法展开的错误。
parkCore
的类型是
String?
-你刚才说过。我更新了代码,将
parkCode.substringToIndex(3)
替换为
parkCode?.substringToIndex(3)
。或者,您可以使用非可选的
parkCode
,而不是使用可选的
parkCode
。我也尝试过这一点,但我无法捕捉到零。它确实包含在if语句中。当我打印ln时,值也会显示出来。