从自定义UITableViewCell发送数据到详细ViewController - Swift

时间:2016-02-11 23:55:26

标签: ios swift uitableview custom-cell detailview

我对编程比较陌生,这是我第一次尝试开发没有教程的iOS,所以请耐心等待。

我有一个名为'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 个答案:

答案 0 :(得分: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%确定在任何情况下他们都不会为零。

至于你的特殊崩溃,你可以纠正我,如果我错了,但我怀疑它是因为你的detailViewController上有四个变量正在viewDidLoad中访问,但是你'只在segue中设置其中一个。这意味着在viewDidLoad中你将尝试访问那些(并且他们也有!),因为它不会发现任何事情,它会立即崩溃。看看是否修复了这个,并且摆脱了一些!的帮助。