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

NSTextField富文本含特定字符时自动换行异常求助

macOS NSTextField富文本自动换行异常(含单引号/扩展ASCII字符#213时失效)

在macOS开发中,我遇到NSTextField富文本自动换行异常问题:当字符串包含单引号或macOS扩展ASCII字符#213(快捷键shift+opt.+])时,文本无法正确换行。通过iTunesLibrary框架获取媒体项标题时,Apple不会对字符串做转义处理。

我测试了四种字符串场景:

  • iTunesLibrary API返回的原始字符串:换行失效
  • 转义单引号后的字符串:换行仍失效
  • 使用扩展ASCII字符#213的字符串:换行失效
  • 使用波浪号的字符串:仅这种情况能让文本在单元格中正确换行,但波浪号并非合适的替代字符

我已经耗时6-8小时排查问题,附上相关代码文件:

ViewController.swift

import Cocoa
import iTunesLibrary

class ViewController: NSViewController {
    @IBOutlet weak var tableView: NSTableView!
    var mediaTitles: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        loadiTunesMediaTitles()
        tableView.delegate = self
        tableView.dataSource = self
    }

    private func loadiTunesMediaTitles() {
        do {
            let library = try ITLibrary(apiVersion: "1.0")
            mediaTitles = library.allMediaItems.map { $0.title }
            // 手动添加测试字符串
            mediaTitles.append("Test string with 'single quote' that won't wrap")
            mediaTitles.append("Test string with \u{00D5} (ASCII #213) that won't wrap")
            mediaTitles.append("Test string with ~ tilde that wraps correctly")
        } catch {
            print("Failed to load iTunes library: \(error)")
        }
    }
}

extension ViewController: NSTableViewDelegate, NSTableViewDataSource {
    func numberOfRows(in tableView: NSTableView) -> Int {
        return mediaTitles.count
    }

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        guard let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("TextFieldCell"), owner: self) as? NSTableCellView else {
            return nil
        }
        let textField = cell.textField!
        textField.cell = VerticallyCenteredTextFieldCell()
        textField.stringValue = mediaTitles[row]
        textField.isEditable = false
        textField.isSelectable = true
        textField.lineBreakMode = .byWordWrapping
        textField.maximumNumberOfLines = 0
        return cell
    }
}

VerticallyCenteredTextFieldCell.swift

import Cocoa

class VerticallyCenteredTextFieldCell: NSTextFieldCell {
    override func drawingRect(forBounds rect: NSRect) -> NSRect {
        let textRect = super.drawingRect(forBounds: rect)
        let textHeight = self.cellSize(forBounds: rect).height
        let centerY = rect.origin.y + (rect.size.height - textHeight) / 2
        return NSRect(x: textRect.origin.x, y: centerY, width: textRect.size.width, height: textHeight)
    }
}

有没有其他开发者遇到过相同问题,或者能提供可行的解决方案?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:55:19