当前位置: 首页 > 知识库问答 >
问题:

如何以编程方式向UITableVIew添加UILabels?[重复]

佟颖逸
2023-03-14

我对使用Swift的UIKit相对较新。目前,我正在尝试制作一个简单的UITableView,其中包含每个单元格的几个UILabels(纯粹以编程方式),尽管我在尝试这样做时遇到了很多麻烦。我的代码如下:

import UIKit

class SettingsVC: UIViewController {
    
    var settingsTableView = UITableView(frame: .zero, style: .insetGrouped)

    override func viewDidLoad() {
        super.viewDidLoad()
        createTableView()
    }
    
    func createTableView() {
        view.addSubview(settingsTableView)
        setTableViewDelegates()
        
        settingsTableView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            settingsTableView.topAnchor.constraint(equalTo: view.topAnchor),
            settingsTableView.leftAnchor.constraint(equalTo: view.leftAnchor),
            settingsTableView.rightAnchor.constraint(equalTo: view.rightAnchor),
            settingsTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        ])
    }
    
    func setTableViewDelegates() {
        settingsTableView.delegate = self
        settingsTableView.dataSource = self
    }
}

extension SettingsVC: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
}

这是当前在模拟器中显示的内容。

这是我想看到的。

我如何着手改变我先前存在的代码以得到我所寻求的最终结果?我有一种感觉,这与我的代理或数据源有关,但无论我做什么,我似乎总是迷路。任何帮助都将不胜感激。

共有2个答案

拓拔富
2023-03-14

您需要先制作一个自定义的单元格类

class CustomTableViewCell: UITableViewCell

确保为您的自定义单元格提供reuse标识符。例如,

class CustomTableViewCell: UITableViewCell { 
    static let reuseIdentifier: "CustomTableViewCell"  
}

在该单元类中,配置所需的标签,就像在Setting sVC中使用setting sTableView所做的那样

并在SettingsVC中的cellForRowAt函数中返回您的CustomTableViewCell

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: CustomTableViewCell.reuseIdentifier) as? CustomTableViewCell else {
        print("Cannot find CustomTableViewCell")
        return UITableViewCell()
    }

    return cell
}

满和安
2023-03-14

关于缺少数据源,您是正确的。您必须声明您的数据源。我已经重构了您的一些代码,如下所示

import UIKit

class SettingsVC: UIViewController {
    
    lazy var settingsTableView: UITableView = {
        let tableView = UITableView(frame: .zero, style: .insetGrouped)
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.delegate = self
        tableView.dataSource = self
        return tableView
    }()
    
    //cell identifier
    let cellIdentifier = "CellName"
    
    //declare a datasource with your data
    let myDataSource = ["Hello", "There", "My", "Friend"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupView()
    }
    
    func setupView() {
        view.addSubview(settingsTableView)
        NSLayoutConstraint.activate([
            settingsTableView.topAnchor.constraint(equalTo: view.topAnchor),
            settingsTableView.leftAnchor.constraint(equalTo: view.leftAnchor),
            settingsTableView.rightAnchor.constraint(equalTo: view.rightAnchor),
            settingsTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        ])
    }
}


extension SettingsVC: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myDataSource.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // This is how UITableView works:
        // when the table becomes very long (let's say millions of cells)
        // then the table will first allocate 4-5 cells to fill the iPhone's screen
        // depend on the device's screen size, the number of cells will be different.
        // as long as users scroll the table view down, the table view will re-use existing cells and update the values accordingly, there is no new memory allocated
        // So the cell can be re-usable therefore you should call this func below to reduce memory warning issue
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
        guard let myCell = cell else {
            return UITableViewCell()
        }
        let myText = myDataSource[indexPath.row]
        myCell.textLabel?.text = myText
        return myCell
    }
}
 类似资料:
  • 我正在使用SpringDoc,并试图以编程方式向OpenApi添加一个模式,但没有成功。 mySchema的描述没有添加到我在生成的YAML文件中看到的模式列表中,如果我试图引用它:

  • 我正在尝试在Android上添加Wifi网络,我想知道如何连接到不广播其SSID的Wifi网络(它是否有空SSID或带有\0s的清晰SSID)。 这是我目前用于广播其SSID的Wifi网络的内容:

  • 问题内容: 我有一个奇怪的问题。我试图以编程方式将dataSource分配给表。 我已使用界面生成器在ViewController中为其创建了一个和IBOutlet。我创建了一个实现的类。我将表的设置为dataSource的实例。一切都会编译并正常运行,直到设置dataSource的行在运行时执行。 错误是并且定义线突出显示。 有什么想法为什么我得到这个运行时错误?我正在Swift中使用XCode

  • 问题内容: 我需要以编程方式向JSF页面添加JS和CSS资源。目前尚不清楚如何实现这一目标。有人可以提供提示或启动示例吗? 问题答案: 这取决于您到底想在哪里声明资源。 通常 ,以编程方式声明它们的唯一原因是您拥有一个自定义或生成HTML代码,而这些代码又需要这些JS和/或CSS资源。然后由或声明它们。 但是,如果您 确实 需要在其他地方声明它们,例如 在 渲染响应 之前 调用的backing b

  • 如何以编程方式在Spring Boot中将内容添加到endpoint?文档指出,通过使用接口,这对于endpoint是可能的。endpoint也有什么吗? 我想在那里添加操作系统名称和版本以及其他运行时信息。

  • 我还在想办法弄清楚回收站。我有一个arraylist,用于初始化回收器视图。 如何在设置适配器和布局管理器后向回收器视图添加新项目? 所以基本上,在我和之后,我如何向RecyclerView添加一个新项目呢??