You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:如何不使用HTML,通过代码创建带表格的NSAttributedString

直接用NSMutableAttributedString构建表格

当然可以跳过HTML转换,纯代码实现带表格的NSAttributedString!苹果提供了NSTextTable和NSTextTableCell这类专门的类来处理富文本表格,下面就用你示例里的两行两列表格来演示:

完整实现代码

import UIKit // 若是Mac平台则导入AppKit

func createTableAttributedString() -> NSAttributedString {
    // 初始化可变富文本对象
    let mutableAttrStr = NSMutableAttributedString()
    
    // 1. 创建表格实例,配置列数和列宽
    let table = NSTextTable()
    table.numberOfColumns = 2
    table.columnWidths = [65.5, 65.5] // 和你HTML里的宽度保持一致
    table.borderWidth = 1 // 可选:添加边框,还原HTML默认表格的视觉效果
    
    // 2. 构建第一行
    let firstRow = NSTextTableBlock(table: table, startingRow: 0, rowSpan: 1, startingColumn: 0, columnSpan: 2)
    // 第一行第一个单元格
    let cellA = NSTextTableBlock(table: table, startingRow: 0, rowSpan: 1, startingColumn: 0, columnSpan: 1)
    cellA.content = NSAttributedString(string: "a")
    // 第一行第二个单元格
    let cellB = NSTextTableBlock(table: table, startingRow: 0, rowSpan: 1, startingColumn: 1, columnSpan: 1)
    cellB.content = NSAttributedString(string: "b")
    // 将单元格加入行
    firstRow.addTableCell(cellA)
    firstRow.addTableCell(cellB)
    
    // 3. 构建第二行
    let secondRow = NSTextTableBlock(table: table, startingRow: 1, rowSpan: 1, startingColumn: 0, columnSpan: 2)
    let cellC = NSTextTableBlock(table: table, startingRow: 1, rowSpan: 1, startingColumn: 0, columnSpan: 1)
    cellC.content = NSAttributedString(string: "c")
    let cellD = NSTextTableBlock(table: table, startingRow: 1, rowSpan: 1, startingColumn: 1, columnSpan: 1)
    cellD.content = NSAttributedString(string: "d")
    secondRow.addTableCell(cellC)
    secondRow.addTableCell(cellD)
    
    // 4. 将行加入表格,再把表格内容附加到可变富文本
    table.addTableBlock(firstRow)
    table.addTableBlock(secondRow)
    mutableAttrStr.append(table.attributedString())
    
    return mutableAttrStr
}

// 使用示例
let tableAttrStr = createTableAttributedString()

关键细节说明

  • NSTextTable:作为表格的容器,你可以在这里配置列数、列宽、边框宽度等全局表格属性。
  • NSTextTableBlock:既可以代表整行,也可以代表单个单元格——通过columnSpan参数区分:如果columnSpan等于表格列数,就是行;如果等于1,就是单个单元格。
  • 自定义样式:如果需要给单元格内的文本加样式(比如字体、颜色),直接给cell.content传入带属性的NSAttributedString即可:
    let cellAttrs: [NSAttributedString.Key: Any] = [
        .font: UIFont.systemFont(ofSize: 14, weight: .medium),
        .foregroundColor: UIColor.darkGray
    ]
    cellA.content = NSAttributedString(string: "a", attributes: cellAttrs)
    

这种纯代码的方式比HTML转换更灵活,你可以动态调整表格结构、样式,完全不需要依赖字符串拼接和HTML解析。

内容的提问来源于stack exchange,提问作者alagris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:10:18