我正在使用 swift 4.2 构建 iOS 应用程序,并且我有一个具有奇怪行为的 TableViewController。
这是代码:
import UIKit
class StoreByCategoryViewController: UITableViewController{
@IBOutlet var storeTableView: UITableView!
var categorySelected:CategoryModel?
var listaStore = [StoreModel]()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Elenco Partner"
if((categorySelected) != nil && categorySelected?.id != "0"){
//posso chiamare il WS estraendo tutti i negozi
//per categoria
getStoreByCategory(category : self.categorySelected!);
storeTableView.reloadData()
}else{
getStore();
}
storeTableView.delegate = self
storeTableView.dataSource = self
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return listaStore.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return listaStore.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = storeTableView.dequeueReusableCell(withIdentifier:"customCell") as! StoreTableViewCell
let storeModel = listaStore[indexPath.row]
cell.storeAddress.text = storeModel.address
cell.storePhone.text = storeModel.phoneNumber
cell.storeDescription.text = storeModel.description
if(storeModel.imageUrl != ""){
print(storeModel.imageUrl)
let imageUrl:NSURL = NSURL(string: storeModel.imageUrl!)!
print(storeModel.imageUrl)
DispatchQueue.global(qos: .userInitiated).async {
let imageData:NSData = NSData(contentsOf: imageUrl as URL)!
DispatchQueue.main.async {
let image = UIImage(data: imageData as Data)
cell.storeImage.image = image
cell.storeImage.contentMode = .scaleToFill
}
}
}
// cell.storeImage.layer.cornerRadius = cell.storeImage.frame.height / 2
return cell
}
func getStoreByCategory(category : CategoryModel){
var params = [
"cat_id" : category.id
]
let postUrl = APIRequest(endPoint: "get_store_by_category")
postUrl.sendRequest(parameters: params as! [String : String]) {
responseObject, error in
guard let responseObject = responseObject, error == nil else {
print(error ?? "Unknown error")
return
}
do{
let messageData = try JSONDecoder().decode(ResponseStoreByCategoryModel.self, from: responseObject)
var array = messageData.result
for store in array {
var imageUrl = ""
if(store.image.count > 0){
imageUrl = store.image[0].image
}
let s = StoreModel(id: "",
description: store.firstName,
imageUrl: imageUrl,
address: store.address,
phoneNumber: store.phone)
self.listaStore.append(s)
}
self.storeTableView.reloadData()
}catch{
print("errore durante la decodifica dei dati")
}
}
}
func getStore(){
var params = [
"" : ""
]
let postUrl = APIRequest(endPoint: "get_store")
postUrl.sendRequest(parameters: params as! [String : String]) {
responseObject, error in
let user = CategoryModel(id: "0",
description: "Tutti",
imageUrl: "")
//self.listaCategorie.append(user)
guard let responseObject = responseObject, error == nil else {
print(error ?? "Unknown error")
return
}
do{
let messageData = try JSONDecoder().decode(ResponseStoreModel.self, from: responseObject)
var array = messageData.result
for store in array {
var imageUrl = ""
if(store.image.count > 0){
imageUrl = store.image[0].image
}
let s = StoreModel(id: "",
description: store.firstName,
imageUrl: imageUrl,
address: store.address,
phoneNumber: store.phone)
self.listaStore.append(s)
}
self.storeTableView.reloadData()
}catch{
print("errore durante la decodifica dei dati")
}
}
}
}
方法 getStore、getStoreByCategory,返回 9 项,但是该方法
numberOfSection 和填充 customCell 的方法被调用 3 次。所以我有一个包含 27 个项目而不是 9 个项目的表。
看起来您只需要 1 个包含 9 行的部分。如果是这种情况,您可以从
numberOfSections
实现返回 1。
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
我注意到的另一件事是 - 你还有一个
UITableViewController
和一个 @IBOutlet var storeTableView: UITableView!
。您不需要插座,您可以使用 self.tableView
来实现同样的目的。
您似乎在 StoreByCategoryViewController 中遇到了意外行为,其中 numberOfSections(in:) 和 tableView(_:cellForRowAt:) 方法被多次调用,导致出现 27 个单元格,而不是预期的 9 个单元格。发生这种情况的原因是由于各种原因,确保表视图数据源方法的正确实现至关重要。以下是一些可能的原因和解决方案:
通过仔细检查这些方面,您应该能够识别并解决导致表格视图显示的单元格数量超出预期的问题。