我遇到了 SwiftUI 的ForEach视图的奇怪行为。
我注意到 ForEach 总是根据其重复次数将其子视图初始化为应有的两倍。通常,当渲染视图时,它的 init 会被调用一次。但是,如果将视图放入 ForEach 中并循环 4 次,则子视图将被初始化 8 次,而不是 4 次。
这是我想要的行为还是我错过了什么?
您可以使用下面的简单代码对其进行测试。
测试环境:Xcode 14.0.1、iOS 16、模拟器 iPhone 13 Pro(带 iOS 16)
我很感激任何反馈!
struct ContentView: View {
var body: some View {
VStack {
// Note that ForEach is looped 4 times!
ForEach(0..<4, id: \.self) { _ in
CustomView() // -> this view is initialized 8 times instead of 4.
}
}
}
}
struct CustomView: View {
// custom initializer with print …Run Code Online (Sandbox Code Playgroud) 我正在尝试将项目列表添加到视图中,同时上面有一个图标。目前,当我构建代码时,它将图标和列表分开,这正是我正在寻找的,但它使图标静态且列表可滚动。我希望图标和列表一起移动。
let items = ["Text", "Text", "Text", "Text"]
struct SignInView: View {
var body: some View {
NavigationView {
VStack {
Image(systemName: "car.fill")
.font(.system(size: 40))
.foregroundColor(.blue)
.frame(width: 150, height: 150)
List {
ForEach(items, id: \.self) { item in
HStack {
Image(systemName: "house.fill")
.foregroundColor(.blue)
Text(item)
Spacer ()
Text("1")
Image(systemName: "chevron.forward")
.foregroundColor(.blue)
}
}
}
}
}.navigationBarTitle("Car", displayMode: .inline)
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个NavigationView和以下视图结构ViewA -> ViewB -> ViewC,我试图弄清楚如何检测 ViewB 何时返回 ViewA ViewB -> ViewA。这是我的代码:
struct ViewA: View {
var body: some View {
NavigationView {
NavigationLink{
ViewB()
}label: {
Text("Go to ViewB")
}
}
}
}
struct ViewB: View {
@Environment(\.presentationMode) var presentationMode: Binding
var body: some View {
NavigationLink{
ViewC()
}label: {
Text("Go to ViewC")
}
.onAppear{
print("onAppear \(presentationMode.wrappedValue.isPresented)")
}
.onDisappear{
print("onDisappear \(presentationMode.wrappedValue.isPresented)")
}
}
}
struct ViewC: View {
var body: some View {
Text("ViewC")
} …Run Code Online (Sandbox Code Playgroud) 我有一组工具栏按钮,仅当设备是 iPhone(不是 iPad)时才应显示。
以下代码失败并出现此错误:
包含控制流语句的闭包不能与结果生成器“ToolbarContentBuilder”一起使用
我确实明白为什么它会失败,但我无法提出一个解决方案来实现我所需要的。
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
List {
NavigationLink(
destination: Hello(),
label: {
Text("Hello")
})
}
}
}
}
struct Hello: View {
var body: some View {
Text("Hello World")
.toolbar() {
if UIDevice.current.userInterfaceIdiom == .phone {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
// do something
}, label: {
Text("Button1")
})
}
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
// do something
}, label: {
Text("Button2")
})
}
}
ToolbarItem(placement: …Run Code Online (Sandbox Code Playgroud) 目标是拥有如下所示的东西:
我知道.rotationEffect()以及此处提供的解决方案。
然而,这个解决方案的问题是它不旋转框架,它只旋转文本本身。
下图来自 Xcode 中的 Canvas 预览及其下面的代码。
HStack(spacing: 10) {
Text("Distance")
.rotationEffect(.degrees(270))
.foregroundColor(.black)
.minimumScaleFactor(0.01)
Rectangle()
.foregroundColor(.black)
.frame(width: 3)
.padding([.top, .bottom])
Spacer()
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,文本超出了框架,框架保持其原始宽度,这使得文本很难紧贴视图的一侧,也很难让垂直线紧贴文本的一侧。
我能够弄清楚如何获得所需结果的唯一方法是使用修饰符.offset(x:)。但这感觉很混乱,并且我认为可能会导致错误。
有什么办法可以让框架随着文字一起旋转吗?
我现在正在创建一个从 API 获取数据的 SearchBar,以红色突出显示的文本(见下图)是我想在 tap 时传递给我的 userDefault 字符串的内容。只要我点击突出显示的红色文本,这就会起作用,当您点击该行中的任何地方(例如空白处)时,是否可以获得该值?任何建议都会很棒。
@State var model: [SearchModel]
var defaults = UserDefaults.standard
@State var isOpen: Bool = false
Run Code Online (Sandbox Code Playgroud)
以上是我的 State 变量和我的用户 default 。我不会显示整个代码,因为问题仅在于下面的 . 如您所见,我的值在foreach 中, 我只想拥有它,以便如果用户单击行的空白区域,我仍然可以执行此代码。
.onTapGesture {
isOpen = true
// I set the value here
defaults.setValue(value.name, forKey: "location")
}.fullScreenCover(isPresented: $isOpen, content: MainView.init)
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我正确的值,但它与文本相关联
ZStack {
Color(UIColor.white)
.ignoresSafeArea()
ScrollView(showsIndicators: false) {
LazyVStack {
ForEach(model) { value in
VStack(alignment: .leading) {
HStack {
Text(value.name)
.font(.system(size: 15))
.background(Color.red)
.padding(.trailing, 10.0)
.onTapGesture {
isOpen = true …Run Code Online (Sandbox Code Playgroud) swiftui ×6
swiftui-view ×6
swift ×2
ios ×1
swiftui-list ×1
swiftui-text ×1
toolbaritems ×1
xcode ×1
xcode14.3 ×1