我试图得到VC对应的单元格的表视图加载时点击。我试图将indexPath设置为selectedIndexPath,并在collection视图中设置segue,然后在tableView中使用它,但它抛出了一个错误。这是密码。

import UIKit

private let reuseIdentifier = "profileCell"


class CompanyCollectionViewController: UICollectionViewController {

//MARK: - View Did Load

override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

}


// MARK: UICollectionViewDataSource

override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}


override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return stuff.company.count
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ProfileCollectionViewCell

    cell.profileImageView.image = UIImage(named: stuff.company[indexPath.row]["image"]!)

    return cell
}

//MARK: - Prepare For Segue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "profileSegue" {
        let profileVC = segue.destinationViewController as!
            MyProfileTableViewController
        let cell = sender as! UICollectionViewCell
        let indexPath = collectionView?.indexPathForCell(cell)

        profileVC.selectedIndexPath = indexPath

    }
}

}
然后
import UIKit

class MyProfileTableViewController: UITableViewController {

//MARK: - View Did Load

override func viewDidLoad() {
    super.viewDidLoad()
}





//MARK: - Table View Data Source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    if let indexPath = selectedIndexPath {

        let row = stuff.company[indexPath.row]

        let cell = tableView.dequeueReusableCellWithIdentifier("myProfileCell", forIndexPath: indexPath) as! MyProfileTableViewCell
            cell.heroImageView.image = UIImage(named: row["image"]!)
            title = row["name"]
            cell.nameLabel.text = row["name"]
            cell.statusLabel.text = row["description"]
            return cell

    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier("myProfileCell", forIndexPath: indexPath) as! MyProfileTableViewCell
        cell.heroImageView.image = UIImage(named: stuff.profile["profile image"]!)
        title = stuff.profile["name"]
        cell.nameLabel.text = stuff.profile["name"]
        cell.statusLabel.text = stuff.profile["status"]
        return cell
    }
}

//MARK: - Variables

var selectedIndexPath: NSIndexPath?

}

最佳答案

啊,我明白了,你不是在检查你的收藏观吗?.indexPathForCell正在返回有效的结果。

   if let cell = sender as? UICollectionViewCell {
       // Cell is valid
       if let indexPath = collectionView?.indexPathForCell(cell) {
           // indexPath is valid
       } else {
           // indexPath is invalid
       }
   } else {
       // cell is invalid
   }

我怀疑表中的indexPath和选择视图中的indexPath混淆了,上面的代码应该可以帮助您调试。
除此之外,我相信您可以通过以下方式实现您的预期结果:
1)将selectedIndexPath保存在DidSelectCellatinIndexPath:方法中
2)在prepareForSegue中读取selectedIndexPath,而不是从segue发送方派生indexPath

07-24 09:44
查看更多