试图让 numberOfRowsInSection 计数等于 Swift 中另一个文件的数组计数

Posted

技术标签:

【中文标题】试图让 numberOfRowsInSection 计数等于 Swift 中另一个文件的数组计数【英文标题】:Attempting to get numberOfRowsInSection count to be equal to an array count from another file in Swift 【发布时间】:2018-08-02 02:13:44 【问题描述】:

目前我正在从 firebase 获取数据,将数据转换为对象数组,并尝试将该数组计数作为“numberOfRowsInSection”的计数。 所以,我在声明数组的视图控制器上得到了正确的计数,但是当我将该数据传递给 tableview 控制器时,我一直得到 0。

下面我展示了我正在获取数据并将其放入过滤数组的视图控制器:

 func fetchAllData( completion: @escaping (_ call: [Restaurant]) -> Void) 

    self.ref = Database.database().reference()
    self.ref?.observe(.value, with:  (snap) in
        guard let topArray = snap.value as? [[String:Any]] else print(":(") ; return 
        var restaurantArray = [Restaurant]()

        for dictionary in topArray 
            self.restaurantGroup.enter()
            guard let address = dictionary["Address"] as? String,
                let city = dictionary["City"] as? String,
                let inspectionDate = dictionary["Inspection Date"] as? String,
                let name = dictionary["Name"] as? String,
                let major = dictionary["Number of Occurrences (Critical Violations)"] as? Int,
                let minor = dictionary["Number of Occurrences (Noncritical Violations)"] as? Int,
                let violationTitle = dictionary["Violation Title"] as? String else  continue 
            print(2)
            //MARK: - creates restaurants from the list above
            let restaurant = Restaurant(address: address, city: city, inspectionDate: inspectionDate, name: name, major: major, minor: minor, violationTitle: violationTitle)

            print(3)
            //MARK: - Adds a restaurant to restaurant array instance
            restaurantArray.append(restaurant)
        
        self.restaurantList = restaurantArray
        self.restaurantGroup.leave()
        completion(self.restaurantList)

        let dictionaryNew = Dictionary(grouping: self.restaurantList)  $0.name + " " + $0.address

        self.restaurantListModified = dictionaryNew
        print(self.restaurantListModified.count)
     )
     

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) 

    var filteredArray = [[Restaurant]]()
    guard let userSearch = searchBar.text?.uppercased() else  return 
    pulleyViewController?.setDrawerPosition(position: .partiallyRevealed, animated: true)

    var nameArray = [String]()

    for (key, value) in restaurantListModified 

        if value[0].name.hasPrefix(userSearch.uppercased())
            filteredArray.append(value)
        
    

    for subarray in filteredArray 
        let nameArrayForTBView = subarray[0].name
        nameArray.append(nameArrayForTBView)
    
    self.tableViewNameArray = nameArray
    print("\(tableViewNameArray.count)????????????????????????????????????????????????")
    print("this First")


tableViewNameArray 是我试图传递给这个 tableView 控制器的数组

   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    print("This second")
   print(MapViewController.sharedMapViewController.tableViewNameArray.count)

    return MapViewController.sharedMapViewController.tableViewNameArray.count


我还将我的数组设置为在 tableView 控制器中接收到的通知中心,如下所示:

var tableViewNameArray = [String]() 

    didSet 
        DispatchQueue.main.async 
          DispatchQueue.main.async 
        NotificationCenter.default.post(name: MapViewController.RestaurantNotification.notificationSet, object: self)
        
        
    

积分:

    我的视图控制器数组在视图控制器上得到了正确的计数,但准确的计数没有传递给 tableView 控制器。 正在传递的数组的 tableview 计数为 0

【问题讨论】:

当新数据传递给它时,您实际上需要重新加载 tableview。这是再次调用 numberOfRowsInSection 函数的唯一方法。所以,当你设置属性观察者 tableViewNameArray 时,你需要在主线程中调用 tableview.reloadData() 方法用新数据再次触发进程。 我即将对其进行测试。我在 tableview 控制器上有这样的观察者: NotificationCenter.default.addObserver(self, selector: #selector(reloadTableView), name: MapViewController.RestaurantNotification.notificationSet, object: nil) 我应该做些不同的事情吗? reloadTableView 函数内部发生了什么? 这里是函数:@objc func reloadTableView() DispatchQueue.main.async self.restaurantListTableView.reloadData() 你认为我应该关闭主异步吗? 【参考方案1】:

我发现了@Kamran 指出的问题。我没有分配 self.tableViewNameArray = nameArray。所以我改变了

var tableViewNameArray to 
static var tableViewNameArray

如果您像我一样不熟悉编程,请务必阅读更多有关局部变量和全局变量的内容。很有帮助。

【讨论】:

以上是关于试图让 numberOfRowsInSection 计数等于 Swift 中另一个文件的数组计数的主要内容,如果未能解决你的问题,请参考以下文章

与数据源相比,UITableView 显示的行数不一致

ReloadData 不会触发 tableView:numberOfRowsInSection:

对成员 '(_:numberOfRowsInSection:)' 的模糊引用

如何返回 numberOfRowsInSection?

数组未与 tableView(numberOfRowsInSection) 方法连接

numberOfRowsInSection:核心数据和多个部分的方法