【问题标题】:How to load a UITableView from a nib file into a container view in a parent view controller?如何将 nib 文件中的 UITableView 加载到父视图控制器中的容器视图中?
【发布时间】: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。使用调试器单步调试代码并检查变量,以便找出“工作”和不工作之间的不同之处。

标签: swift uitableview xib nib uicontainerview


【解决方案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
         }
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多