在传递prepareForSegue时,如何将模型对象传递给VC?

时间:2016-03-03 16:14:25

标签: ios objective-c swift

我的prepareForSegue代码如下所示:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "ShowVerse" {

        let pageDetailViewController = segue.destinationViewController as! PageViewController

        // Get the cell that generated this segue.
        if let selectedPageCell = sender as? PageTableViewCell {
            let indexPath = tableView.indexPathForCell(selectedPageCell)!
            let selectedPage = pages[indexPath.row]
            pageDetailViewController.page = selectedPage
        }
    }

}

然而,这一行:

let selectedPageCell = sender as? PageTableViewCell

返回nil,因此,没有信息传递给ViewController。

如何确定返回nil的原因?最后,我如何成功地将selectedPageCell作为PageTableViewCell分配给我的发件人。

我的 TableViewCell.swift

import UIKit

class PageTableViewCell: UITableViewCell {

    // MARK: Properties
    @IBOutlet weak var chapter: UILabel!
    @IBOutlet weak var verse: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

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

        // Configure the view for the selected state
    }

}

I'm basing my app off of this Apple Tutorial

2 个答案:

答案 0 :(得分:1)

这里你真正需要的是所选行的索引 - 所以你可以将它作为类级变量,并在didSelectRowAtIndexPath中分配

以下是代码的概述 - 包含有关您的类名的各种假设

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
{
    var selectedIndexPathRow = -1

    ... more code ...

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        selectedIndexPathRow = indexPath.row
    }


    ... more code ...

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    {
        if segue.identifier == "ShowVerse" 
        {
            if selectedIndexPathRow != -1 // default value to show that something has been selected 
            {
                pageDetailViewController.page = pages[selectedIndexPathRow]
            }
        }
    }

... more code ...

}

答案 1 :(得分:0)

希望这会对您有所帮助。使用以下代码替换您的代码。

你需要将(sender:AnyObject?)替换为(sender:AnyObject!)并将(sender作为?PageTableViewCell)替换为(sender作为PageTableViewCell)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

if segue.identifier == "ShowVerse" {

    let pageDetailViewController = segue.destinationViewController as? PageViewController

    // Get the cell that generated this segue.
    if let selectedPageCell = sender as? PageTableViewCell {
        let indexPath = tableView.indexPathForCell(selectedPageCell)!
        let selectedPage = pages[indexPath.row]
        pageDetailViewController.page = selectedPage
    }
}}

快乐的编码。提供您的反馈。