无法从 UITableViewCell 调用 performeguewithidentifier

Posted

技术标签:

【中文标题】无法从 UITableViewCell 调用 performeguewithidentifier【英文标题】:can't call performseguewithidentifier from UITableViewCell 【发布时间】:2017-03-21 04:04:47 【问题描述】:

我不能在 Infinite3TableViewCell 类里面调用 performeguewithidentifier。我知道它是 UITableViewCell。 那么,Infinite3TableViewCell中如何调用performeguewithidentifier方法呢?

我想选择一个单元格然后呈现/切换到新的 ViewController。

// MARK: - UITableViewDataSource, UITableViewDelegate 最终类 BuyTableViewController: UIViewController

@IBOutlet weak var tableView: UITableView! 
    didSet 
        tableView.delegate = self
        tableView.dataSource = self
        tableView.separatorStyle = .none
    

// MARK: - UITableViewDataSource, UITableViewDelegate 扩展 BuyTableViewController: UITableViewDataSource, UITableViewDelegate

override func viewDidLoad() 
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()



func numberOfSections(in tableView: UITableView) -> Int 
    return 5



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    switch section 
    case 0, 1, 2, 3, 4: return 1
    default: return 0
    



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    switch indexPath.section 

    case 0:
        let cell = tableView.dequeueReusableCell(withIdentifier: "Infinite0TableViewCell", for: indexPath)
        return cell
    case 1:
        let cell = tableView.dequeueReusableCell(withIdentifier: InfiniteTableViewCell.identifier) as! InfiniteTableViewCell
        return cell
    case 2:
        let cell = tableView.dequeueReusableCell(withIdentifier: Infinite2TableViewCell.identifier) as! Infinite2TableViewCell
        return cell
    case 3:
        let cell = tableView.dequeueReusableCell(withIdentifier: Infinite3TableViewCell.identifier) as! Infinite3TableViewCell
        return cell
    case 4:
        let cell = tableView.dequeueReusableCell(withIdentifier: Infinite4TableViewCell.identifier) as! Infinite4TableViewCell
        return cell
    default:
        return UITableViewCell()
    



func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    switch indexPath.section 
    case 0: return 80
    case 1: return 150
    case 2: return 120
    case 3: return 400
    case 4: return 500
    default: return 0
    

最终类 CollectionViewCell: UICollectionViewCell

@IBOutlet weak var imgImage: UIImageView!

@IBOutlet weak var lblName: UILabel!

@IBOutlet weak var imgEffect: UIVisualEffectView!

最终类 Infinite3TableViewCell: UITableViewCell

static let identifier = "Infinite3TableViewCell"


var nameArray = ["Women's Clothing", "Beauty & Personl Care", "Women's Bags", "Men's Clothing", "Mobile & Gadgets", "Watches", "Home", "Toys", "Home Appliances"]
var imgName = [UIImage(named: "girl"), UIImage(named: "makeup"), UIImage(named: "bags"), UIImage(named: "clothing"), UIImage(named: "mobile"), UIImage(named: "watches"), UIImage(named: "living"), UIImage(named: "toys"), UIImage(named: "tools")]

扩展 Infinite3TableViewCell: UICollectionViewDelegate, UICollectionViewDataSource

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int

    return nameArray.count




func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell



    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCollectionViewCell", for: indexPath) as! CollectionViewCell
    cell.imgImage.image = imgName[indexPath.row]
    cell.lblName.text! = nameArray[indexPath.row]
    return cell





func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 


    print("didSelectItemAt: \(indexPath.item)")

【问题讨论】:

请只发布相关代码(并请正确格式化)。 为什么要从表格视图单元格中调用performseguewithidentifier?单元格不直接知道它何时被单击。您会知道何时从 UITableView 委托方法 didSelectRowAt 单击单元格,这将是调用 segue 的逻辑位置。 @rmaddy 对不起。因为我第一次使用***。 【参考方案1】:

performseguewithidentifier 应该从 UIViewController 或其子类中调用。你应该让UIViewController 知道并打电话给它。

【讨论】:

那么,我该怎么办? 在您的func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 中调用performseguewithidentifier BuyTableViewController 如果我将 didSelectItemAt 放在 BuyTableViewController 中。当我单击单元格中的 tableview 3 时,系统如何知道我单击了它? @aahung link “单元格中的 tableview 3 是什么意思”?如果您将 tableview 的委托设置为 BuyTableViewController,则当您选择一个单元格时它会知道

以上是关于无法从 UITableViewCell 调用 performeguewithidentifier的主要内容,如果未能解决你的问题,请参考以下文章

无法从 UITableViewCell 加载 UICollectionView

从使用 nasm 制作的基本 PE+ uefi 应用程序调用 ExitBootServices 时遇到问题

重新排序时无法从当前位置拖动 UITableViewCell

无法从出列可重用 UITableViewCell 加载自定义单元格

从 UITableViewCell 呈现 UIViewController:addChildViewController 无法识别的选择器发送到实例

UIView 动画在 UITableViewCell 内无法正常工作