Ios 试图使numberOfRowsInSection计数等于Swift中另一个文件的数组计数
目前,我正在从firebase获取数据,将数据转换为一个对象数组,并尝试将该数组计数作为“numberOfRowsInSection”的计数。 因此,我在声明数组的视图控制器上获得了正确的计数,但当我将数据传递给tableview控制器时,我一直得到0 下面我展示了viewcontroller,我在其中提取数据并将其放入过滤数组:Ios 试图使numberOfRowsInSection计数等于Swift中另一个文件的数组计数,ios,arrays,swift,uitableview,Ios,Arrays,Swift,Uitableview,目前,我正在从firebase获取数据,将数据转换为一个对象数组,并尝试将该数组计数作为“numberOfRowsInSection”的计数。 因此,我在声明数组的视图控制器上获得了正确的计数,但当我将数据传递给tableview控制器时,我一直得到0 下面我展示了viewcontroller,我在其中提取数据并将其放入过滤数组: func fetchAllData( completion: @escaping (_ call: [Restaurant]) -> Void) {
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)I found the problem that @Kamran pointed to. I was not assigning self.tableViewNameArray = nameArray. So I changed
var tableViewNameArray to
static var tableViewNameArray
func fetchAllData(完成:@escaping(u-call:[Restaurant])->Void){
self.ref=Database.Database().reference()
self.ref?.observe(.value,带:{(管理单元)}
guard let topArray=snap.value as?[[String:Any]]else{print(“:(”);return}
var restaurantArray=[餐厅]()
用于topArray中的字典{
self.restaurantGroup.enter()
guard let address=字典[“地址”]作为字符串,
将city=字典[“city”]设为?字符串,
将inspectionDate=字典[“检查日期”]设为?字符串,
将name=字典[“name”]设为?字符串,
让major=dictionary[“发生次数(严重违规)”]为?Int,
让minor=dictionary[“发生次数(非关键违规)”]为?Int,
让violationTitle=dictionary[“Violation Title”]作为字符串else{continue}
印刷品(2)
//MARK:-从上面的列表中创建餐厅
let restaurant=餐厅(地址:地址,城市:城市,检查日期:检查日期,姓名:姓名,专业:主要,次要:次要,违例标题:违例标题)
印刷品(3)
//MARK:-将餐厅添加到餐厅数组实例
餐厅附加(餐厅)
}
self.restaurantList=restaurantArray
self.restaurantGroup.leave()
完成(自助餐厅列表)
让dictionaryNew=Dictionary(分组:self.restaurantList){$0.name++$0.address}
self.restaurantListModified=dictionaryNew
打印(self.restaurantListModified.count)
})
}
func searchBar searchbutton单击(searchBar:UISearchBar){
var filteredArray=[[餐厅]]()
guard let userSearch=searchBar.text?.uppercased()else{return}
PulleryViewController?.SetDroperPosition(位置:。部分预览,动画:true)
变量nameArray=[String]()
对于restaurantListModified中的(键,值){
if值[0].name.hasPrefix(userSearch.uppercased()){
filteredArray.append(值)
}
}
用于FilterDarray中的子阵列{
让nameArrayForTBView=子阵列[0]。名称
nameArray.append(nameArrayForTBView)
}
self.tableViewNameArray=nameArray
print(“\(tableViewNameArray.count)我发现了@Kamran指出的问题。我没有分配self.tableViewNameArray=nameArray。所以我改变了
如果你是像我这样的编程新手,请确保阅读更多关于局部和全局变量的内容。这非常有用。当新数据传递到tableview时,你实际上需要重新加载tableview。这是再次调用numberOfRowsInSection函数的唯一方法。因此,当你设置属性observer 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()}}}你认为我应该关闭主异步吗?