标签: swiftui-view

为什么 ForEach 在 SwiftUI 中初始化其子视图的次数是两倍?

我遇到了 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)

initialization swiftui swiftui-foreach swiftui-view

11
推荐指数
0
解决办法
615
查看次数

SwiftUI:将列表添加到上面有图标的滚动视图中

我正在尝试将项目列表添加到视图中,同时上面有一个图标。目前,当我构建代码时,它将图标和列表分开,这正是我正在寻找的,但它使图标静态且列表可滚动。我希望图标和列表一起移动。

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)

swiftui swiftui-list swiftui-view

5
推荐指数
1
解决办法
2833
查看次数

SwiftUI:检测 NavigationView 返回主视图

我有一个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)

swiftui swiftui-navigationview swiftui-view xcode14.3

5
推荐指数
1
解决办法
822
查看次数

SwiftUI:如何仅显示 iPhone 的一些工具栏按钮

我有一组工具栏按钮,仅当设备是 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)

toolbaritems swiftui swiftui-view

4
推荐指数
1
解决办法
772
查看次数

如何使 SwiftUI 中的文本在旋转框架的同时出现在侧面?

目标是拥有如下所示的东西:

所需结果的示例

我知道.rotationEffect()以及此处提供的解决方案。

然而,这个解决方案的问题是它不旋转框架,它只旋转文本本身。

下图来自 Xcode 中的 Canvas 预览及其下面的代码。

使用 .rotationEffect() 的结果

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:)。但这感觉很混乱,并且我认为可能会导致错误。

有什么办法可以让框架随着文字一起旋转吗?

xcode swift swiftui swiftui-text swiftui-view

4
推荐指数
1
解决办法
599
查看次数

Swiftui 如何在 foreach 循环中为整行使用点击手势

我现在正在创建一个从 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)

ios swift swiftui swiftui-view

3
推荐指数
2
解决办法
811
查看次数