附加数组时Anyobject to string

时间:2014-12-22 03:21:40

标签: xcode uitableview swift

我正在尝试在textLabel中检查的第一个单元格的tableView中获取该名称,但我似乎无法将AnyObject转换为一个字符串。我的错误说:

fatal error: unexpectedly found nil while unwrapping an Optional value

它出现在我的代码的最后一行。

var stringList = [String]()

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

    let mySelectedCell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!

    if (mySelectedCell.accessoryType == UITableViewCellAccessoryType.Checkmark) {
        mySelectedCell.accessoryType = UITableViewCellAccessoryType.None           
    }
    else {
        mySelectedCell.accessoryType = UITableViewCellAccessoryType.Checkmark
        mySelectedCell.tintColor = UIColor.blackColor()

        if let tx = mySelectedCell.textLabel?.text as Optional{

            stringList.append(tx)}
         }        
    }
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var destVC: AddFriendViewController = segue.destinationViewController as AddFriendViewController

        destVC.viewOut.text! = stringList[0] as String
}

任何关于如何进行的想法都将不胜感激。

编辑:目标VC的代码:

@IBOutlet weak var usernameLabel: UITextField!

@IBOutlet weak var viewOut: UITextField!

var viewer:String = String()

override func viewDidLoad() {
    super.viewDidLoad()

    viewOut.text = viewer

    // Do any additional setup after loading the view.
}

编辑2:通过替换prepareForSegue函数,我摆脱了错误,但标签仍然没有显示任何文字。

func friendAdded(){

    var destVC: AddFriendViewController = AddFriendViewController()
        destVC.viewer = stringList[0]    
}

1 个答案:

答案 0 :(得分:0)

有几个问题:

  1. 您无法让源控制器尝试访问目标的IBOutlet。在调用prepareForSegue时,IB网点引用的控件尚未创建,因此viewOut无疑仍为nil

    所以,不要让prepareForSegue执行以下操作:

    destVC.viewOut.text! = stringList[0] as String
    

    它应该只设置String属性,viewer

    destVC.viewer = stringList[0]
    

    然后目标的viewDidLoad将填充UITextField中名为viewOut的名为String的{​​{1}}控件:

    viewer
  2. 您的代码示例并不完全清楚,但看起来您可能同时拥有viewOut.text = viewer 方法以及从单元格到目标视图控制器的segue。 (我猜这是因为我在这里没有看到任何以编程方式启动segue的内容。)

    如果是这样,那就是一个问题,因为在调用 didSelectRowAtIndexPath之前可能会执行(即你会在didSelectRowAtIndexPath之前看到prepareForSegue) 。要解决此问题,请将segue从单元格移除到下一个场景,而是在两个场景之间进行segue。 (即,当您选择单元格时,不会自动调用segue。)如果您为该segue提供唯一的故事板ID,则可以从didSelectRowAtIndexPath以编程方式调用它:

    didSelectRowAtIndexPath
  3. 这更具学术性(与手头的问题无关),但通常不应检索要从单元格传递到下一个场景的文本。你真的应该回到你的模特。