swift 表视图单元格不显示detailTextLabel

xxhby3vn  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(141)

获取要在我的UITableView中显示的辅助数据时出现问题。我有3件数据从API回来-名称,地址,电话。没有问题得到“姓名”显示,但当我试图显示次要数据(地址,电话)我卡住了。这里有两个代码文件,一个是处理TableView的ViewControllerFile,另一个是处理数据解析的Model文件。在我的代码中,次要数据被称为“detailedTextLabel”。任何帮助非常感谢!
第一个代码文件是ViewController -第二个是Model文件。

import UIKit

struct SportsItem {
    let facility: String
    let address: String
    let telephone: String
}

class SportsResultsViewController: UIViewController, UITableViewDataSource {
    var sportsData: [SportsItem] = []
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sportsData.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath)
       
        cell.textLabel?.text = sportsData[indexPath.row].facility
        cell.detailTextLabel?.numberOfLines = 0
        cell.detailTextLabel?.text = "Address: \(sportsData[indexPath.row].address)\nPhone: \(sportsData[indexPath.row].telephone)"
        
        cell.textLabel?.font = UIFont.systemFont(ofSize: 8)
        cell.detailTextLabel?.font = UIFont.systemFont(ofSize: 8)
        
        return cell
    }
    
    var jsonString: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        resultsTableView.dataSource = self
        resultsTableView.register(UITableViewCell.self, forCellReuseIdentifier: "CellIdentifier")
        resultsTableView.cellLayoutMarginsFollowReadableWidth = true
        resultsTableView.rowHeight = UITableView.automaticDimension
        resultsTableView.estimatedRowHeight = 164.0
        
        
        
        if let jsonString = jsonString {
            if let data = jsonString.data(using: .utf8),
               let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
               let features = json["features"] as? [[String: Any]] {
                
                var sportsData: [SportsItem] = []
                
                for i in 0..<min(10, features.count) {
                    if let feature = features[i]["properties"] as? [String: Any]? ?? [:],
                       let address = feature["Address"] as? String,
                       let telephone = feature["Telephone"] as? String,
                       let facility = feature["Facility Name"] as? String {
                        
                        let sportsItem = SportsItem(facility: facility, address: address, telephone: telephone)
                        sportsData.append(sportsItem)
                    }
                }
                
                self.sportsData = sportsData
                
                if sportsData.isEmpty {
                    // Handle empty data case if needed
                }
                
                resultsTableView.reloadData()
            }
        }
    }
    

    @IBAction func findHotelsPressed(_ sender: UIButton) {
        UIApplication.shared.open(URL(string: "https://www.hotels.com/de606379/hotels-hong-kong-hong-kong-sar/")!)
    }
    
    @IBOutlet weak var resultsTableView: UITableView!
    
    
    
}

第二个代码文件(数据模型文件)...

import UIKit

struct SportsManager {
    let sportsURL = "https://geodata.gov.hk/gs/api/v1.0.0/geoDataQuery?q=%7Bv%3A%221%2E0%2E0%22%2Cid%3A%22d1a2e8e0-8636-41e9-b664-0e64b86860a2%22%2Clang%3A%22ALL%22%7D"
    
    func getSportsData(completion: @escaping (String?) -> Void) {
        guard let url = URL(string: sportsURL) else { return }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print(error.localizedDescription)
                completion(nil)
                return
            }
            
            guard let data = data else {
                completion(nil)
                return
            }
            
            do {
                let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                let jsonString = try JSONSerialization.data(withJSONObject: jsonData ?? "", options: .prettyPrinted)
                let sportsData = String(data: jsonString, encoding: .utf8)
                completion(sportsData)
            } catch let error {
                print(error.localizedDescription)
                completion(nil)
            }
        }.resume()
    }
}

地址行未出现在表格单元格中:

dm7nw8vv

dm7nw8vv1#

问题是,单元格的detailTextLabel仅在单元格使用.default以外的样式创建时才有效。在本例中,您希望使用.subtitle样式创建单元格。
你有两个可能的解决方案。一个是修复你的代码,另一个是正确地更新你的故事板。
仅代码:
1.删除线路:

resultsTableView.register(UITableViewCell.self, forCellReuseIdentifier: "CellIdentifier")

1.替换行:

let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath)

与线:

let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) ?? UITableViewCell(style: .subtitle, reuseIdentifier: "CellIdentifier")

就是这样。现在您应该可以在每个单元格中看到两行文本。
故事板:
既然您已经在故事板中创建了表格视图(基于它是一个插座),那么您确实应该在故事板中完成所有表格和单元格的设置。通过故事板和outlet添加表视图没有什么意义,但可以使用代码进行设置。在情节提要中连接表的数据源和代理出口。在情节提要中设置原型单元格。在本例中,将单元格的Style设置为“Subtitle”,并将Identifier设置为“CellIdentifier”。
另外请注意,自iOS 14以来,使用textLabeldetailTextLabel的旧样式表格单元格设置已被弃用。除非您需要支持iOS 13,否则您应该使用所需的内容创建自己的自定义单元格,或者使用新的内容配置API。

相关问题