UITableView 的委托是 Nil

Posted

技术标签:

【中文标题】UITableView 的委托是 Nil【英文标题】:Delegate is Nil with UITableView 【发布时间】:2020-07-31 01:57:09 【问题描述】:

我是 Swift 新手,正在尝试结合 UITableViews 学习委托。我有 2 个场景:具有图像和按钮的主场景 (UIViewController)。按钮前进到第二个场景:选择场景(UITableViewController)。在每个 TableviewCells 中,我都有一个用户将选择的图像,然后我想回到主屏幕,该图像将被加载到图像位置。我将所有内容都嵌入到导航控制器中。代表总是出现零,我不知道为什么......谢谢你

“选择场景 - 发送者”

 protocol TableViewControllerDelegate : class 

func passBackInformation (image: UIImage, name: String)



class TableViewController: UITableViewController 


weak var tableViewControllerDelegate : TableViewControllerDelegate?

...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    
    let image = UIImage(named: productArray[indexPath.row].imageName)!
    let name = productArray[indexPath.row].productName
    
    if self.tableViewControllerDelegate != nil 
        self.tableViewControllerDelegate?.passBackInformation(image: image, name: name)
    else
        print("Still no delegate")
    

这是我的委托 (UIViewController) 中的代码 - 接收器

class ViewController: UIViewController, TableViewControllerDelegate 

func passBackInformation(image: UIImage, name: String) 
        frontProductImage.image = image
        frontLabel.text = name
        
    

@IBAction func frontBUtton(_ sender: Any) 
        
        let selectionVC = storyboard?.instantiateViewController(withIdentifier: "SelectProduct") as! TableViewController
        
        selectionVC.tableViewControllerDelegate = self
        dismiss(animated: true, completion: nil)
       

【问题讨论】:

在设置委托之前放置一个NSLog("%p %d",self, (self!=nil))。因为我们看不到你在哪里初始化 ViewController .. 【参考方案1】:

在名为 frontBUtton() 的 IBAction 中,正在实例化视图控制器并设置委托。但随后新的视图控制器立即被解除。

与其关闭视图控制器,不如展示它:

present(selectionVC, animated: true, completion: nil)

将数据传回 tableview 控制器后,在此处关闭视图控制器,如下所示:

    if self.tableViewControllerDelegate != nil 
            self.tableViewControllerDelegate?.passBackInformation(image: image, name: name)
            dismiss(animated: true, completion: nil)
        else
            print("Still no delegate")
        

【讨论】:

不错的收获,来之不易

以上是关于UITableView 的委托是 Nil的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 永远不会在其委托上调用 tableView:shouldShowMenuForRowAtIndexPath:

NSFetchedResultsController(和 UITableView)委托方法调用越来越多

VIPER中UITableView委托和数据源的实现

在单独的文件中设置 UITableView 数据源和委托 - swift

如何手动调用 UITableView 的委托方法?

未调用 UICollectionView 内部 UITableView 的委托方法