从另一个视图控制器 swift 重新加载表视图时发现 Nil 错误

Posted

技术标签:

【中文标题】从另一个视图控制器 swift 重新加载表视图时发现 Nil 错误【英文标题】:Found Nil Error when reload table view from another view controller swift 【发布时间】:2019-02-07 10:06:52 【问题描述】:

我在从另一个 vc 更新 tableview 时遇到问题。 最初我在CalendarTableViewControllerlike 中声明它:

func reloadData() 
        print("days array in tableview is: \(WorkshopBookingsViewController.daysArray)")
        calendarTableView.reloadData()

//        tableView.reloadData()
    

它被WorkshopBookingsViewController 调用,例如:

    func newDate() 
        let calendar = Calendar.current
        let currentDate = self.dateToDisplay!
        let components = (calendar as NSCalendar).components([.year, .month, .day, .weekday, .hour, .minute] , from: currentDate)

        self.displayedMonth = components.month!
        self.monthCounter = self.displayedMonth - 1
        print("mounthCounter is:\(self.monthCounter)")


        //get days in courrent month ansd append it to daysArray to populate TableView
        let daysRange = calendar.range(of: .day, in: .month, for: currentDate)!
        WorkshopBookingsViewController.daysArray.removeAll()
        for day in 1...daysRange.count 
            WorkshopBookingsViewController.daysArray.append(String(day))
        
        print(WorkshopBookingsViewController.daysArray)
        self.actualMonthLabel.text = self.monthsArray[self.monthCounter]
        let tableView = CalendarTableViewController()
//        let tableView:CalendarTableViewController!
        tableView.reloadData()


    

在函数定义中我得到了 Found Nil 错误。

我尝试实施解决方案 reload tableView from Another ViewController Swift 4.2

从注释掉的行可以看出

// let tableView:CalendarTableViewController!

但它给我带来了另一个错误:

Constant 'tableView' used before being initialized.

谁能明白为什么会这样?

【问题讨论】:

另一个视图控制器是什么意思?需要添加到导航堆栈中的视图控制器还是已经在导航堆栈中的视图控制器? 您应该更正您发布的代码。他们不匹配。由于tableView Controller 没有你提到的reloadData()calendarTableView 根本不存在 @MahendraGP。我从WorkshopBookingsViewController调用reloadData()函数,它有一个容器视图,里面有tableview。 CalendarTableViewController 是在 Interface Builder 中设计的吗?如果是,则默认初始化程序CalendarTableViewController() 创建一个新实例,其中未连接的出口不是故事板中的实例。 @vadian。我明白了,所以我要实例化一个新的而不是引用现有的?是因为我缺少包含 tableview 的容器视图的出口吗? 【参考方案1】:

您已经创建了一个 CalendarTableViewController 并立即尝试访问此 CalendarTableViewController 中的子视图。但是方法 loadViews() 和 viewDidLoad() 还没有被调用,你所有的子视图都为零。我建议您阅读文档https://developer.apple.com/reference/uikit/uiviewcontroller中有关 UIViewController 生命周期的信息

【讨论】:

我将问题编辑得更清楚一点。欢迎来到社区 错了! ViewController 的主视图是延迟加载的,如果需要,它们会在调用时立即加载。 tableViewUITableViewContoller的主视图 所以我应该刷新'WorkshopBookingsViewController`insted 重新加载tableview 数据?抱歉,我有点迷路了【参考方案2】:

我终于明白了我的错误的原因。我正在为容器视图中的CalendarTableVIewcontained 使用自定义类。所以我完全摆脱了容器视图,我只是放置了一个 TableView 并有一个引用它的插座。 选择自定义类的最初选择是,我不仅将WorkshopBookingsViewController子类化为UITableViewDelegateUITableViewDataSource,而且将UITableView..因此错误误导我完全选择嵌入CalendarTableVIew一个容器,但不需要它,因为我还将拥有一个集合视图,我还将将WorkshopBookingsViewController 子类化为UICollectionViewDelegateUICollectionViewDataSource。 感谢你们的帮助,我可以看到我哪里出错了。像往常一样非常感谢,很高兴成为这个社区的一员。

【讨论】:

以上是关于从另一个视图控制器 swift 重新加载表视图时发现 Nil 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何重新加载UIPageViewController以在Swift中重新加载其视图

如何快速从另一个视图控制器重新加载表格视图

使用标签栏从另一个视图返回时如何重新加载视图控制器

当我从另一个视图控制器调用时,为啥我的表视图为零?

如何从另一个 UIViewController 重新加载 UITableViewController

如何重新加载 UIPageViewController 以在 Swift 中重新加载其视图