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
相关产品推荐
相关产品推荐

