使用父视图和子视图时如何在 SwiftUI 中给出条件?
How to give condition in SwiftUI while using parent and child view?
我有下面的自定义视图,我正在另一个视图中使用它
import SwiftUI
public struct TopSheet<Content >: View where Content : View {
private var content: () -> Content
@State private var arrowOffset: Double = 0
public init(@ViewBuilder content: @escaping () -> Content) { self.content = content }
public func expandRatio() -> Double { return max((currentHeight - minHeight) / contentHeight, 0) }
public var body: some View {
HStack(alignment: .center) {
Arrow(offset: arrowOffset)
.stroke(Color.pink, style: StrokeStyle(lineWidth: 4, lineCap: .round, lineJoin: .round))
.frame(width: 30, height: 4)
Spacer()
}
}
}
我在下方视图中使用上方视图
import SwiftUI
struct PassengerView: View {
@State private var passengers: [String] = ["Joe Black", "Eva Green", "Jared Leto"]
var body: some View {
TopSheet {
VStack {
ForEach($passengers, id: \.self) { passenger in
HStack {
Text(passenger.wrappedValue)
Spacer()
}
}
}
.padding(.horizontal, .afklPaddingL)
}
}
}
这里我想给出一个条件 Arrow()
from Topsheet
只有当乘客人数大于 1 时才应该可见。
我不确定我应该如何给出这个条件,因为两者都处于差异视图中。
试试这个:
为您的 TopSheet
添加一个变量:
var count: Int
将构造函数更改为:
public init(count: Int, @ViewBuilder content: @escaping () -> Content) {
self.count = count
self.content = content
}
和您的 body 到:
public var body: some View {
HStack(alignment: .center) {
if count > 1 {
Arrow(offset: arrowOffset)
.stroke(Color.pink, style: StrokeStyle(lineWidth: 4, lineCap: .round, lineJoin: .round))
.frame(width: 30, height: 4)
}
Spacer()
}
}
这样称呼它:
TopSheet(count: passengers.count) {
VStack {
........
由于 passengers
是一个 @State
变量,它会随着它的变化重新评估您的观点。
我有下面的自定义视图,我正在另一个视图中使用它
import SwiftUI
public struct TopSheet<Content >: View where Content : View {
private var content: () -> Content
@State private var arrowOffset: Double = 0
public init(@ViewBuilder content: @escaping () -> Content) { self.content = content }
public func expandRatio() -> Double { return max((currentHeight - minHeight) / contentHeight, 0) }
public var body: some View {
HStack(alignment: .center) {
Arrow(offset: arrowOffset)
.stroke(Color.pink, style: StrokeStyle(lineWidth: 4, lineCap: .round, lineJoin: .round))
.frame(width: 30, height: 4)
Spacer()
}
}
}
我在下方视图中使用上方视图
import SwiftUI
struct PassengerView: View {
@State private var passengers: [String] = ["Joe Black", "Eva Green", "Jared Leto"]
var body: some View {
TopSheet {
VStack {
ForEach($passengers, id: \.self) { passenger in
HStack {
Text(passenger.wrappedValue)
Spacer()
}
}
}
.padding(.horizontal, .afklPaddingL)
}
}
}
这里我想给出一个条件 Arrow()
from Topsheet
只有当乘客人数大于 1 时才应该可见。
我不确定我应该如何给出这个条件,因为两者都处于差异视图中。
试试这个:
为您的 TopSheet
添加一个变量:
var count: Int
将构造函数更改为:
public init(count: Int, @ViewBuilder content: @escaping () -> Content) {
self.count = count
self.content = content
}
和您的 body 到:
public var body: some View {
HStack(alignment: .center) {
if count > 1 {
Arrow(offset: arrowOffset)
.stroke(Color.pink, style: StrokeStyle(lineWidth: 4, lineCap: .round, lineJoin: .round))
.frame(width: 30, height: 4)
}
Spacer()
}
}
这样称呼它:
TopSheet(count: passengers.count) {
VStack {
........
由于 passengers
是一个 @State
变量,它会随着它的变化重新评估您的观点。