2016-02-11 35 views
0

我对编程相对比较陌生,这是我第一次尝试在开发iOS时没有遵循教程,所以请耐心等待。从自定义UITableViewCell发送数据到详细ViewController - Swift

我有一个名为'CupboardViewController'的自定义表格视图,该视图基于名为'ItemTableViewCell'的自定义UITableViewCell类返回四个字符串标签。当用户点击一个表项时,我希望能够在一个名为'detailViewController'的独立视图控制器中显示这四个标签。

这是我有的代码,但它调用segue时没有明显的错误消息崩溃。请帮忙!

CupboardViewController

override func prepareForSegue(segue: UIStoryboardSegue, 
    sender: AnyObject!) { 
     // sender is the tapped `UITableViewCell` 
     let cell = sender as! ItemTableViewCell 
     let indexPath = self.tblItems.indexPathForCell(cell) 

     // load the selected model 
     let titleToPass = itemMgr.items[indexPath!.row].name 

     let detail = segue.destinationViewController as! detailViewController 
     // set the model to be viewed 
     detail.titleToPass = titleToPass 
} 

}

detailViewController

@IBOutlet weak var titleDetailLabel: UILabel! 
@IBOutlet weak var qtyDetailLabel: UILabel! 
@IBOutlet weak var dateDetailLabel: UILabel! 
@IBOutlet weak var descriptionDetailLabel: UILabel! 

var titleToPass: String! 
var qtyToPass: String! 
var descriptionToPass: String! 
var dateToPass: String! 



override func viewDidLoad() { 
    super.viewDidLoad() 

    titleDetailLabel.text = titleToPass 
    qtyDetailLabel.text = qtyToPass 
    dateDetailLabel.text = dateToPass 
    descriptionDetailLabel.text = descriptionToPass 
} 

    // Do any additional setup after loading the view. 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

ItemTableViewCell

@IBOutlet weak var itemTitle: UILabel! 
@IBOutlet weak var itemSubtitle: UILabel! 
@IBOutlet weak var itemSubDetail: UILabel! 
@IBOutlet weak var dateDetail: UILabel! 

override func awakeFromNib() { 


    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
+1

作为一般规则,尽量避免强制展开Optionals(例如!),除非您绝对确定它们不会为零。相反,你应该使用“如果让”或“警惕”。这样你可以迎合他们的零,这可能是发生了什么事情。什么是你得到的确切的错误,以及在哪一行? – Michael

回答

0

这绝对是最好避免展开力尽可能多,所以我绝对推荐在大多数情况下使用guard letif let。除了让你免受崩溃之外,他们还提供了一些很好的方法来查看你的代码在哪里失败,否则更难追踪。

例如,你有这条线,它返回一个可选的NSIndexPath

let indexPath = self.tblItems.indexPathForCell(cell) 

而不是武力展开这个可选的,你可以稍微修改线路,使其处理为零,并且还添加了打印告诉你这行失败,这样的:

guard let indexPath = self.tblItems.indexPathForCell(cell) else { 
    print("No index path returned.") 
    return 
} 

如果该值不为零,你可以用indexPath常像往常一样工作。你可能会希望继续使用这些选项中的大部分,除非你100%确定它们在任何情况下都不会成立。

至于你的特定崩溃,你可以纠正我,如果我错了,但我怀疑这是因为你有在viewDidLoad访问您的detailViewController这四个变量,但你只设置其中之一赛格。这意味着在viewDidLoad中,您将尝试访问这些(并且它们也有!),并且因为它不会找到任何内容,所以会立即崩溃。看看是否修复该问题,并摆脱一些!有帮助。

相关问题