- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义 View (DisclosableControl),它有条件地公开 UI 控件。
为了使其尽可能适应,初始化程序接受闭包,闭包生成 subview 以显示用户输入和控件的结果。由于这些 subview 依赖于容器的状态,因此创建它们的闭包接受通用绑定(bind)。
在 DisclosableControl 的 init 中传递闭包效果很好,但它非常冗长并且会使逻辑难以推理,所以我想在 Root View 的扩展中将它们定义为计算属性或函数的返回值.
这在 Playground 中运行良好,但令我惊讶的是,将此代码插入我当前的项目会导致项目内部出现编译器错误(“View as a type cannot conform to the protocol itself”)。
为了弄清楚出了什么问题,我将工作中的 Playground 代码提取到 Xcode 中,以期“构建”到出现错误的位置。我没有机会这样做,因为有一个与计算属性之一相关的直接编译器错误:“属性定义已推断出类型‘(Binding) -> some View’,涉及‘some’返回类型另一个声明"
有趣的是,另一个闭包(不涉及 UI 控件)似乎很高兴。
最后,试图显式定义闭包属性的类型似乎使事情变得更糟。编译代码的唯一方法是将与 AnyView 的“控件”属性关联的 Picker 类型删除。它有效,但我认为这是一种代码味道。
谁能看出我哪里出错了?
可披露控件 View
struct DisclosableControl<Value, Display: View, Control: View>: View {
@Environment(\.isEnabled) var isEnabled
@State private var isControlDisclosed = false
private var value: Binding<Value>
let title: LocalizedStringKey
let display: Display
let control: Control
init(
_ title: LocalizedStringKey,
value: Binding<Value>,
@ViewBuilder display: @escaping (Binding<Value>) -> Display,
@ViewBuilder control: @escaping (Binding<Value>) -> Control
) {
self.title = title
self.value = value
self.display = display(value)
self.control = control(value)
}
var body: some View {
List {
HStack {
display
.padding(.top, 15)
.overlay(alignment: .topLeading) {
Text(title)
.font(.caption)
.fixedSize()
.foregroundColor(
isEnabled ? Color.accentColor : Color(.systemGray)
)
}
Spacer()
}
.background()
.contentShape(Rectangle())
.onTapGesture {
withAnimation { isControlDisclosed.toggle() }
}
if (isControlDisclosed && isEnabled) {
control
.listRowSeparator(.hidden, edges: .top)
}
}
.animation(.easeInOut, value: isControlDisclosed)
}
}
用于测试的代码(在预览中)
enum TestEnum: String, CaseIterable {
case one, two, three
}
let control = { (value: Binding<TestEnum>) in
Picker("Picker", selection: value) {
ForEach(TestEnum.allCases, id: \.self) { value in
Text(value.rawValue)
}
}
.pickerStyle(SegmentedPickerStyle())
}
let display = { (value: Binding<TestEnum>) in
Text("The value selected was \(value.wrappedValue.rawValue)")
}
struct PlaygroundFile_Previews: PreviewProvider {
static var previews: some View {
Wrapper()
}
struct Wrapper: View {
@State private var value = TestEnum.one
var body: some View {
Form {
Text("Parent view state: \(value.rawValue)")
Disclosable(
"Disclosable Control",
value: $value,
display: display,
control: control)
}
}
}
}
最佳答案
这看起来像是编译器限制——它无法推断出所有需要的类型。一种可能的解决方法是使用内联构建器,例如
struct Wrapper: View {
@State private var value = TestEnum.one
var body: some View {
Form {
Text("Parent view state: \(value.rawValue)")
Disclosable(
"Disclosable Control",
value: $value,
display: display,
control: { value in // << here !!
Picker("Picker", selection: value) {
ForEach(TestEnum.allCases, id: \.self) { value in
Text(value.rawValue)
}
}
.pickerStyle(SegmentedPickerStyle())
})
}
}
}
替代是使用函数,比如
struct Wrapper: View {
@State private var value = TestEnum.one
var body: some View {
Form {
Text("Parent view state: \(value.rawValue)")
Disclosable(
"Disclosable Control",
value: $value,
display: display,
control: control)
}
}
func control(value: Binding<TestEnum>) -> some View {
Picker("Picker", selection: value) {
ForEach(TestEnum.allCases, id: \.self) { value in
Text(value.rawValue)
}
}
.pickerStyle(SegmentedPickerStyle())
}
}
使用 Xcode 13.2/iOS 15.2 测试
关于swiftui - 将命名闭包传递给 init @ViewBuilder 时出现 "View as a type cannot conform to the protocol itself"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71000703/
我需要创建一个类型安全的弱引用数组 一个包含“类型安全”弱引用并且可以是数组元素的结构: public struct WeakRef: Hashable { public weak var r
假设我有这个 Swift 类: class Foo: NSObject, NSCoding { var stringMember: String var intMember: Int
谁能解释一下,下面的例子有什么问题?为什么会抛出 StackOverflowError 异常? (s/def ::tag keyword?) (s/def ::s string?) (s/def ::
啊啊!尝试使用我的神经网络进行计算时,我不断收到以下错误: > net.compute matrix.train1 (Intercept) survived pclass sexmale
我在下面的行中面临警告 此警告在更改以下行后出现 @interface BDSAppDelegate : UIResponder 到 @interface BDSAppDelegate : UIRe
我正在尝试实现 git 项目 XLPagerTabStrip . 根据项目,每个 Controller 必须: Every view controller provided by PagerTabSt
clojure.spec.alpha API 有一个名为 conformer 的宏有这样的描述: Usage: (conformer f) (conformer f unf) takes
iPhone开发中的“符合”是什么意思?这个词被广泛使用,但我找不到令人满意的定义。 假设我们有 3 个类别 - A、B 和 C 如果A继承B&如果A符合C 这是什么意思? 另外,为什么大多数类、协议
我最近刚刚遇到“弱一致性”这个术语(在 Stack Overflow 用户 retronym 对 How to set up implicit conversion to allow arithmet
我在我的一个 MVC 项目中使用 ConfORM Nhibernate。并且有一对多映射的问题。 IEnumerable domainEntities = this.GetDomain
如何对两个数组进行逐元素算术运算在第一个维度上是一致的,但还有一个额外的维度? 示例,将数组 a (3 x 3 x 2) 乘以数组 b (3 x 3): a a * b 要使其工作,您必须将数组 b
我是 swift 新手,并按照教程了解更多信息。 在下面的代码中,我定义了自定义运算符( Bool { for cardValue in valueArray { if lhs
我有来自 here 的 FAA 剖面图.每个包都包含相关图表的 .tif、描述图表的 .htm 文件和 .tfw 世界文件。 map 投影为朗伯共形圆锥投影。 我正在开发一个 C# 应用程序,它需要能
当我在脚本中调用下面的函数时,我会看到一个弹出对话框来执行一些说明。 这是我的示例代码: function updateStatus(instrxnID){ exporter.
我试图通过注入(inject)适应 URLSession 和 URLSessionDataTask 协议(protocol)的对象来测试我自己的类。我正在扩展 NSURLSession 和 NSURL
这个问题在这里已经有了答案: Fatal error: Dictionary does not conform to Decodable because Any does not conform t
我想在我的一个代理类中管理所有位置代码。由于该类(class)是从头开始构建的,而不是构建在 UIView 上的或继承 NSObjectProtocol 的类似类,它会抛出错误“不符合协议(proto
无法理解为什么我的类不符合 Codable请注意,在我的例子中,我不需要实现方法encode 和decode。 public class LCLAdvantagePlusJackpotCache: C
我是 IOS swift 开发新手。我曾经使用以前的 Xcode 6 beta。 我已经下载了 Xcode 6.0.1 但我无法让它工作 Xcode Version: 6.0.1 当我尝试运行示例时,
以下 Scala 声明是可以的: trait Base[B y) then x else y 这相当于将 Ordering(与 java.util.Comparator 相同)传递给函数。确实,宣言
我是一名优秀的程序员,十分优秀!