关于SwiftUI中的视图类型,有一件大事让我感到困惑:
它们似乎不符合该View
协议,但是某种程度上,它们却神秘地遵循了该协议。
以Text
类型为例。它的定义如下:
public struct Text : Equatable { ... }
Run Code Online (Sandbox Code Playgroud)
我找不到任何能增加View
协议一致性的公共扩展,例如
extension Text: View { ... }
Run Code Online (Sandbox Code Playgroud)
官方文档中的“ 关系”部分仅指出:
符合: 平等
仅此而已。
但是,我可以返回一个需要Text
一些实例的实例View
,例如:
var body: some View {
Text("I'm a View, I swear!")
}
Run Code Online (Sandbox Code Playgroud)
如果Text
不符合View
,则将无法执行并引发编译器错误。
(some View
是一种不透明的结果类型,表示它是具有身份的特定类型,但符合View
。)
那怎么可能呢?
View
指定协议一致性SwiftUI视图类型(如Text
,Image
,Circle
,...)?我假设 SwiftUI 不再使用 NSLayoutContstraints。但是我在控制台中收到约束错误。任何人都知道如何调试?
当我打开上下文菜单时,如果使用列表视图,则会打印出以下内容:
2019-12-09 10:52:52.029091-0700 ContextMenuTest[26384:13138419] [LayoutConstraints] 无法同时满足约束。可能以下列表中的至少一项约束是您不想要的。试试这个: (1) 查看每个约束并尝试找出您不期望的;(2) 找到添加不需要的约束或约束的代码并修复它。(注意:如果看到 NSAutoresizingMaskLayoutConstraints 不明白,请参考 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档) ( "", "= 44 (active, names: groupView.actionsSequence...:0x7fd98781de00 )>", "", "", "", "" )
将尝试通过打破约束 = 44(活动,名称:groupView.actionsSequence...:0x7fd98781de00)来恢复>
在 UIViewAlertForUnsatisfiableConstraints 处创建一个符号断点以在调试器中捕获它。中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。
struct ContentView: View {
var body: some View {
List {
Text("one")
Text("two")
.contextMenu(menuItems: {
Text("test")
})
}
}
}
Run Code Online (Sandbox Code Playgroud)