Swift 警报消息中的可滚动NSTextField
我正在用swift(xcode11.6)编写一个例程,在macOS下将rtf格式的文本转换为结构化格式 为了输入纯文本,我尝试定义一个文本字段,该字段可以在警报消息中滚动,并设置了以下例程。不幸的是,警报消息的大小正确,但没有显示文本字段“originaltext”。如果我将“originaltext”定义为NSTextView(uFrame:),并将其作为accessoryView添加到警报消息中,而不是将其作为scrollView添加到警报消息中,则它会起作用,但当然它是不可滚动的 我做错了什么?非常感谢你的支持Swift 警报消息中的可滚动NSTextField,swift,macos,Swift,Macos,我正在用swift(xcode11.6)编写一个例程,在macOS下将rtf格式的文本转换为结构化格式 为了输入纯文本,我尝试定义一个文本字段,该字段可以在警报消息中滚动,并设置了以下例程。不幸的是,警报消息的大小正确,但没有显示文本字段“originaltext”。如果我将“originaltext”定义为NSTextView(uFrame:),并将其作为accessoryView添加到警报消息中,而不是将其作为scrollView添加到警报消息中,则它会起作用,但当然它是不可滚动的 我做错了
private func readNewText() {
let abfrageNeuerText = NSAlert()
abfrageNeuerText.alertStyle = .informational
abfrageNeuerText.messageText = "Input new text"
abfrageNeuerText.informativeText = ""
abfrageNeuerText.addButton(withTitle: "Convert")
abfrageNeuerText.addButton(withTitle: "Cancel")
let scrollView = NSScrollView(frame: NSRect(x:10, y:10, width: 500, height: 700))
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.borderType = .noBorder
scrollView.backgroundColor = NSColor.white
scrollView.hasVerticalScroller = true
// Initial clip view
let clipView = NSClipView()
clipView.translatesAutoresizingMaskIntoConstraints = false
scrollView.contentView = clipView
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .left, relatedBy: .equal, toItem: scrollView, attribute: .left, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .top, relatedBy: .equal, toItem: scrollView, attribute: .top, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .right, relatedBy: .equal, toItem: scrollView, attribute: .right, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .bottom, relatedBy: .equal, toItem: scrollView, attribute: .bottom, multiplier: 1.0, constant: 0))
// Initial document view
let originaltext = NSTextView()
originaltext.translatesAutoresizingMaskIntoConstraints = false
scrollView.documentView = originaltext
clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .left, relatedBy: .equal, toItem: originaltext, attribute: .left, multiplier: 1.0, constant: 0))
clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .top, relatedBy: .equal, toItem: originaltext, attribute: .top, multiplier: 1.0, constant: 0))
clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .right, relatedBy: .equal, toItem: originaltext, attribute: .right, multiplier: 1.0, constant: 0))
abfrageNeuerText.accessoryView = scrollView
let response = abfrageNeuerText.runModal()
switch response {
case .alertFirstButtonReturn:
if originaltext.string.count == 0 {
return
}
analyzeNewtext(forText: originaltext.string)
default: return
}
}
自动布局会让你自己变得更复杂。这是不必要的,整个设置可以缩短很多:
让scrollView=NSScrollView(帧:NSRect(x:0,y:0,宽度:200,高度:100))
scrollView.hasVerticalScroller=true
让clipView=NSClipView(框架:scrollView.bounds)
clipView.autoresizingMask=[.width、.height]
让textView=NSTextView(框架:clipView.bounds)
textView.autoresizingMask=[.width、.height]
clipView.documentView=textView
scrollView.contentView=clipView
在Big Sur上测试:
我现在不能用macOS Catalina测试它(在另一个地方得到),但我看不出为什么它不能工作
旁注-将count==0
替换为isEmpty
还要检查我是否将textView
分配给clipView.documentView
,clipView
分配给scrollView.contentView
。它与您的代码不同
如果您被卡住了,您可以始终将可滚动文本视图添加到interface builder中的某个窗口中,并在运行时检查所有属性,以了解它是如何创建的以及在那里设置了哪些值
完整代码:
private func readNewText(){
let alert=NSAlert()
alert.alertStyle=.information
alert.messageText=“输入新文本”
alert.addButton(标题为“转换”)
alert.addButton(标题为“取消”)
设scrollView=NSScrollView(帧:NSRect(x:0,y:0,宽度:200,高度:100))
scrollView.hasVerticalScroller=true
让clipView=NSClipView(框架:scrollView.bounds)
clipView.autoresizingMask=[.width、.height]
让textView=NSTextView(框架:clipView.bounds)
textView.autoresizingMask=[.width、.height]
clipView.documentView=textView
scrollView.contentView=clipView
alert.accessoryView=滚动视图
let response=alert.runModal()
开关响应{
案例。AlertFirstButton返回:
如果textView.string.isEmpty{
返回
}
打印(“分析:\(textView.string)”)
默认值:返回
}
}
亲爱的zrzka,感谢您的帮助。非常感谢。这就解决了这个问题,效果非常好。正如您所期望的,它在macOS Catalina下也可以正常工作。