为什么macOS中的SwiftUI多行换行文本可以在预览中工作,而在真实应用中却不能?

为什么macOS中的SwiftUI多行换行文本可以在预览中工作,而在真实应用中却不能?,macos,swiftui,nstextfield,Macos,Swiftui,Nstextfield,我有一个显示图像和文本的快捷界面视图 导入快捷界面 #如果可以导入(UIKit) typealias AppColor=UIColor #否则 typealias AppColor=NSColor #恩迪夫 struct ReportErrorUI:视图{ 枚举顺序{ 偶数、奇数 } 让错误:字符串 让我们点菜吧:点菜 初始化(错误:字符串,顺序:顺序){ self.error=错误 self.order=order } var body:一些SwiftUI.View{ 设bgColor=(顺序

我有一个显示图像和文本的快捷界面视图

导入快捷界面
#如果可以导入(UIKit)
typealias AppColor=UIColor
#否则
typealias AppColor=NSColor
#恩迪夫
struct ReportErrorUI:视图{
枚举顺序{
偶数、奇数
}
让错误:字符串
让我们点菜吧:点菜
初始化(错误:字符串,顺序:顺序){
self.error=错误
self.order=order
}
var body:一些SwiftUI.View{
设bgColor=(顺序=.偶数?AppColor.systemGreen:.systemRed)。带AlphaComponent(0.5)
返回VStack(对齐:。前导,间距:0,内容:{
HStack(对齐:。中心,间距:8,内容:{
图像(“icon.error”)
文本(错误)。字体(.body)
}).填充(8)
颜色(.洋红)。边框(高度:2)
}).背景(颜色(bgColor))
}
}
现在我可以预览它了:

导入快捷界面
@可用(OSX 11.0,*)
结构报告错误UI\u预览:预览提供程序{
静态let shortText=“Etiam habebis sem dicantur magna mollis euismod。”
静态let longText=“Tityre,tu patulae recuban sub-temine fagi dolor.Idque Caesaris facere voluntate liceret:sese habere.una incolunt Belgae,aliam Aquitani,tertiam。”
静态变量预览:一些SwiftUI.View{
团体{
VStack(间距:0){
ReportErrorUI(错误:长文本,顺序:。偶数)
ReportErrorUI(错误:短文本,顺序:。奇数)
}.previewLayout(.sizeThatFits)
.background(Color.white).padding().frame(宽度:320)
}
}
}
这是它看起来像:

正如您所看到的,
文本
视图按预期工作–长文本被包装

现在,我通过
NSHostingController
NSHostingView
将此
ReportErrorUI
与老式的
NSTextField
多行标签一起添加到现有的AppKit应用程序中。两个UI元素都添加到了
NSStackView

class MainViewController:ReusableViewController{
private lazy var stackView=NSStackView()
重写func setupUI(){
view.addSubview(stackView)
stackView.TranslatesAutoResizezingMaskintoConstraints=false
stackView.topAnchor.constraint(equalTo:view.topAnchor,常量:8)。isActive=true
stackView.bottomAnchor.constraint(equalTo:view.bottomAnchor,常量:-8)。isActive=true
stackView.leadingAnchor.constraint(等式:view.leadingAnchor,常数:8)。isActive=true
stackView.trailingAnchor.constraint(等式:view.trailingAnchor,常数:-8)。isActive=true
stackView.widthAnchor.constraint(大于或等于常量:120)。isActive=true
stackView.heightAnchor.constraint(大于或等于常量:80)。isActive=true
stackView.orientation=.vertical
stackView.spacing=8
stackView.distribution=.fill
stackView.alignment=.leading
//可包装多行标签。请参阅:https://stackoverflow.com/a/35920653/1418981
让label=NSTextField()
label.stringValue=“不可因铜而导致过失。不可因铜而导致的公共观察。”
label.setContentHuggingPriority(.init(1),用于:。水平)
label.setContentCompressionResistancePriority(.init(1),用于:。水平)
label.isEditable=false
label.backgroundColor=NSColor.品红色,带AlphaComponent(0.4)
label.isBezeled=false
label.isSelectable=true
//>下面4行似乎不需要。
//label.usesSingleLineMode=false
//label.lineBreakMode=.byWordWrapping
//label.cell?.wrapps=true
//label.cell?.isScrollable=false
//<
stackView.addArrangedSubview(标签)
做{
let ui=报告错误ui(错误:“例外情况:不可忽视的过失。不可忽视的责任。”,命令:。偶数)
let view=NSHostingView(rootView:ui)
view.setContentHuggingPriority(.init(1),用于:。水平)
view.setContentCompressionResistancePriority(.init(1),用于:。水平)
view.setContentCompressionResistancePriority(.必选,用于:。垂直)
stackView.addArrangedSubview(视图)
}
做{
let ui=报告错误ui(错误:“例外情况为铜合金非过失责任。公共观察非最新接收。”,订单:。奇数)
让vc=NSHostingController(rootView:ui)
addChild(vc)
setContentHuggingPriority(.init(1),用于:。水平)
setContentCompressionResistancePriority(.init(1),用于:。水平)
vc.view.setContentCompressionResistancePriority(.必选,用于:。垂直)
stackView.addArrangedSubview(vc.view)
}
做{
let view=ReusableView()
view.backgroundColor=.yellow
view.heightAnchor.constraint(大于或等于常量:12)。isActive=true
stackView.addArrangedSubview(视图)
}
}
}
因此,老式的
NSTextField
按预期工作-多行文本在应用程序窗口上自动换行。但是SwiftUI
text
视图中的文本未被包装

UIKit world提供的技巧,如
lineLimit(nil)
.fixedSize(水平:false,垂直:true)
,要么不工作,要么破坏应用程序窗口布局

这里举例说明
.fixedSize(水平:false,垂直:true)
的工作原理-应用程序窗口布局被破坏。无法垂直调整应用程序窗口的大小

setContentCompressionResistancePriority
setContentHuggingPriority
对于
水平
NSHostingView
NSHostingController
上设置的
垂直
轴的任何组合都不起作用


如何使多行包装快捷界面
文本
在macOS上正常工作?

是macOS的解决方案