Swift 的 UITableView 示例

问题描述 投票:0回答:6

我使用 Swift 和 iOS 已有好几个月了。我熟悉许多做事的方法,但我还不够好,我不能不看就直接写下来。我过去很欣赏 Stack Overflow 提供的快速答案,让我重新回到对我已经生疏的主题的正轨(例如,AsyncTask Android 示例)。

iOS 的

UITableView
对我来说就属于这一类。我做过几次,但是忘记了具体内容。我在 StackOverflow 上找不到另一个只要求提供基本示例的问题,我正在寻找比许多在线教程更短的内容(尽管这个非常好)。

我在下面提供一个答案,供我和您将来参考。

ios swift xcode uitableview cocoa-touch
6个回答
239
投票

下面的示例是对 We ❤ Swift 的更长的帖子的改编和简化。这就是它的样子:

enter image description here

创建一个新项目

它可以只是普通的单视图应用程序。

添加代码

ViewController.swift 代码替换为以下内容:

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    // Data model: These strings will be the data for the table view cells
    let animals: [String] = ["Horse", "Cow", "Camel", "Sheep", "Goat"]
    
    // cell reuse id (cells that scroll out of view can be reused)
    let cellReuseIdentifier = "cell"
    
    // don't forget to hook this up from the storyboard
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Register the table view cell class and its reuse id
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        
        // (optional) include this line if you want to remove the extra empty cell divider lines
        // self.tableView.tableFooterView = UIView()

        // This view controller itself will provide the delegate methods and row data for the table view.
        tableView.delegate = self
        tableView.dataSource = self
    }
    
    // number of rows in table view
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.animals.count
    }
    
    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // create a new cell if needed or reuse an old one
        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!
        
        // set the text from the data model
        cell.textLabel?.text = self.animals[indexPath.row]
        
        return cell
    }
    
    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell number \(indexPath.row).")
    }
}

阅读代码中的注释以了解发生了什么。亮点是

  • 视图控制器采用
    UITableViewDelegate
    UITableViewDataSource
    协议。
  • numberOfRowsInSection
    方法确定表视图中有多少行。
  • cellForRowAtIndexPath
    方法设置每一行。
  • 每次点击一行时都会调用
    didSelectRowAtIndexPath
    方法。

将表视图添加到故事板

UITableView
拖到视图控制器上。使用自动布局固定四个边。

enter image description here

连接插座

Control 从 IB 中的表格视图拖动到代码中的

tableView
出口。

完成了

仅此而已。您现在应该可以运行您的应用程序了。

此答案已使用 Xcode 9 和 Swift 4 进行测试


变化

行删除

如果您想让用户能够删除行,您只需在上面的基本项目中添加一个方法即可。请参阅这个基本示例以了解操作方法。

enter image description here

行距

如果您希望行之间有间距,请参阅此补充示例

enter image description here

自定义单元格

表格视图单元格的默认布局可能不是您所需要的。 查看此示例,帮助您开始制作自己的自定义单元格。

enter image description here

动态单元格高度

有时您不希望每个单元格都具有相同的高度。从 iOS 8 开始,可以轻松根据单元格内容自动设置高度。 请参阅此示例,了解入门所需的一切。

enter image description here

进一步阅读


30
投票

为了完整起见,对于那些不想使用 Interface Builder 的人,这里有一种完全以编程方式创建与 Suragch 的答案中相同的表的方法 - 尽管大小和位置不同。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource  {

    var tableView: UITableView = UITableView()
    let animals = ["Horse", "Cow", "Camel", "Sheep", "Goat"]
    let cellReuseIdentifier = "cell"

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.frame = CGRectMake(0, 50, 320, 200)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)

        self.view.addSubview(tableView)
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return animals.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) as UITableViewCell!

        cell.textLabel?.text = animals[indexPath.row]

        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("You tapped cell number \(indexPath.row).")
    }

}

确保您记得

import UIKit


12
投票

在 Swift 4.1 和 Xcode 9.4.1 中

  1. 添加 UITableViewDataSource、UITableViewDelegate 委托给你的类。

  2. 创建表视图变量和数组。

  3. 在viewDidLoad中创建表视图。

  4. 调用表视图委托

  5. 根据您的需求调用表视图委托函数。

import UIKit
// 1
class yourViewController: UIViewController , UITableViewDataSource, UITableViewDelegate { 

// 2
var yourTableView:UITableView = UITableView()
let myArray = ["row 1", "row 2", "row 3", "row 4"]

override func viewDidLoad() {
    super.viewDidLoad()

    // 3
    yourTableView.frame = CGRect(x: 10, y: 10, width: view.frame.width-20, height: view.frame.height-200)
    self.view.addSubview(yourTableView)

    // 4
    yourTableView.dataSource = self
    yourTableView.delegate = self

}

// 5
// MARK - UITableView Delegates
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return myArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

var cell : UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "cell")
    if cell == nil {
        cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    }
    if self. myArray.count > 0 {
        cell?.textLabel!.text = self. myArray[indexPath.row]
    }
    cell?.textLabel?.numberOfLines = 0

    return cell!
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return 50.0
}

如果您使用故事板,则无需第 3 步。

但是您需要在第 4 步之前为表视图创建 IBOutlet。


2
投票

SWIFT 5

如果您只想在屏幕上显示一个 tableView,那么您可以将

UITableViewController
实现到您的
ViewController
并像这样显示一个带有标签的简单
tableViewController

Swift 文件

class ToDoListViewController: UITableViewController {
    let array = ["GAFDGSG","VSBFFSB","BFBFB"]
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        array.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ToDoItemCell", for: indexPath)
        cell.textLabel?.text = array[indexPath.row]
        return cell
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath)
    }
}

并在故事板中创建一个 UITableViewController 并提及这样的标识符

主故事板

enter image description here

结果

enter image description here


0
投票

这是 Swift 4 版本。

import Foundation
import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{ 
    var tableView: UITableView = UITableView()
    let animals = ["Horse", "Cow", "Camel", "Sheep", "Goat"]
    let cellReuseIdentifier = "cell"

    override func viewDidLoad()
    {
        super.viewDidLoad()

        tableView.frame = CGRect(x: 0, y: 50, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)

        self.view.addSubview(tableView)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return animals.count
    }

    internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

        cell.textLabel?.text = animals[indexPath.row]

        return cell
    }

    private func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath)
    {
        print("You tapped cell number \(indexPath.row).")
    }

}

0
投票
//    UITableViewCell set Identify "Cell"
//    UITableView Name is  tableReport

UIViewController,UITableViewDelegate,UITableViewDataSource,UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet weak var tableReport: UITableView!  

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 5;
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableReport.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
            cell.textLabel?.text = "Report Name"
            return cell;
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.