试图让 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 中另一个文件的数组计数的主要内容,如果未能解决你的问题,请参考以下文章
ReloadData 不会触发 tableView:numberOfRowsInSection:
对成员 '(_:numberOfRowsInSection:)' 的模糊引用