Swift 警报消息中的可滚动NSTextField

Swift 警报消息中的可滚动NSTextField,swift,macos,Swift,Macos,我正在用swift(xcode11.6)编写一个例程,在macOS下将rtf格式的文本转换为结构化格式 为了输入纯文本,我尝试定义一个文本字段,该字段可以在警报消息中滚动,并设置了以下例程。不幸的是,警报消息的大小正确,但没有显示文本字段“originaltext”。如果我将“originaltext”定义为NSTextView(uFrame:),并将其作为accessoryView添加到警报消息中,而不是将其作为scrollView添加到警报消息中,则它会起作用,但当然它是不可滚动的 我做错了

我正在用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下也可以正常工作。