如何将 nib 文件中的 UITableView 加载到父视图控制器中的容器视图中?

Posted

技术标签:

【中文标题】如何将 nib 文件中的 UITableView 加载到父视图控制器中的容器视图中?【英文标题】:How to load a UITableView from a nib file into a container view in a parent view controller? 【发布时间】:2019-04-12 15:49:09 【问题描述】:

我正在尝试将包含表视图的视图控制器(我们称之为 VC2)加载到父视图控制器 (VC1) 内的容器视图中。我遇到的问题是,当我尝试在 VC2 中注册 nib 或设置 tableview 的委托/数据源时,出现 nil 错误。

我尝试删除delegatedataSource 连接,但这只会加载一个空白的tableview

这是我用来向容器视图控制器传输数据的代码:

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let listVC = segue.destination as? BusinessListViewController 
            listVC.bottomSheetDelegate = self
            listVC.Businesses = self.Businesses
            listVC.parentView = businessListView
            listVC.viewDidLoad()
         
    

这是 VC2 中的 viewDidLoad() 语句

    override func viewDidLoad() 
        super.viewDidLoad()
        BusinessListTableView.dataSource = self
        BusinessListTableView.delegate = self 
        BusinessListTableView.register(UINib.init(nibName: "BusinessTableViewCell", bundle: nil), forCellReuseIdentifier: "BizCell")
    

我希望有人可以帮助弄清楚如何让这个笔尖正确填充。当通过 segue 导航到 VC2 时,它正在工作。

【问题讨论】:

这对我来说很奇怪,但毕竟你用 .reloadData() 更新了你的 UITableView 了吗? 你是如何设置视图控制器容器的?您需要将VC2 作为child 添加到容器中,将VC2 的视图添加到容器的视图层次结构中,在容器中设置VC2frame(设置约束)然后调用@987654332 @。见Apple's Guide 第一个注意事项:从不调用viewDidLoad() - 这是自动调用的,如果您认为需要调用它,则说明您做错了其他事情。下一步:您说您 “试图将包含 tableview 的视图控制器(我们称之为 VC2)加载到父视图控制器 (VC1) 内的容器视图中” ...显示您正在使用的代码要做到这一点。这可能是您没有做您需要做的事情的地方。 @DonMag 我将 VC2 嵌入到容器视图中,这一切都是通过界面构建​​器完成的。所以没有为此建立代码 仅凭您提供的信息真的很难说... "当我尝试在 VC2 中注册 nib 或设置 tableview 的委托/数据源时,我收到一个 nil 错误" 什么是零?您还说 “当通过 segue 导航到 VC2 时它正在工作” .. 但是您显示的代码 正在导航到它通过segue。使用调试器单步调试代码并检查变量,以便找出“工作”和不工作之间的不同之处。 【参考方案1】:

大概,当您的代码检索数据时,您有一个闭包?如果是这样,请在 prepareForSegue 中保存对“VC2”的引用并在该闭包中设置数据。

伪代码:

class ViewController1: UIViewController 

    var vc2: ViewController2!

    override func viewDidLoad() 
        super.viewDidLoad()

        callToGetData() 
             onCompletion 
                 vc2.Businesses = self.Businesses
                 vc2.reload()
             
        

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let listVC = segue.destination as? BusinessListViewController 
            listVC.bottomSheetDelegate = self
            listVC.parentView = businessListView
            vc2 = listVC
         
    

【讨论】:

以上是关于如何将 nib 文件中的 UITableView 加载到父视图控制器中的容器视图中?的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

UITableView 作为 NIB 中的子视图的问题

如何将 UITableView 的背景设置为图像?

当在 nib 中声明 UITableView 时,UITableViewCell nil IBOutlets [重复]

在 iOS 上的一个 UITableView 中加载两个不同的 nib

iPhone:标签栏下的 UITableView 滚动