标签: swiftui-navigationlink

Swift UI 教程错误“包含控制流语句的闭包不能与函数构建器‘ViewBuilder’一起使用”

我尝试了 swiftUI 教程“处理用户输入”。

https://developer.apple.com/tutorials/swiftui/handling-user-input

使用“For”而不是“For Each”实现。但是会出现错误“包含控制流语句的闭包不能与函数构建器‘ViewBuilder’一起使用”。

我怎么做?

从:

import SwiftUI

struct LandmarkList: View {
    @State var showFavoritesOnly = true
    
    var body: some View {
        NavigationView{
            List{
                Toggle(isOn: $showFavoritesOnly){
                    Text("Show FavatiteOnly")
                }
                
                ForEach(landmarkData) { landmark in
                    if !self.showFavoritesOnly || landmark.isFavorite {
                            NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                                LandmarkRow(landmark: landmark)
                            }
                        }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至(我写道):

import SwiftUI

struct LandmarkList: View {
    @State var showFavoritesOnly = true
    
    var body: some View {
        NavigationView{
            List{
                Toggle(isOn: $showFavoritesOnly){
                    Text("Show FavatiteOnly")
                }
                
                for landmark …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-list swiftui-navigationlink swiftui-foreach

6
推荐指数
2
解决办法
6487
查看次数

在菜单中使用 NavigationLink (SwiftUI)

您可以在 swiftUI 中将aNavigationLink用作 aMenu的项目吗?

它似乎什么都不做:

Menu {
   NavigationLink(destination: Text("test1")) {
       Text("item1")
   }
   NavigationLink(destination: Text("test2")) {
       Text("item2")
   }
} label: {
   Text("open menu")
}
Run Code Online (Sandbox Code Playgroud)

如果它不能像上面尝试的那样工作,是否有其他方法可以实现预期的结果?

swift swiftui swiftui-navigationlink

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

更新父视图时,NavigationLink 页面会自动关闭

我正在尝试使用 SwiftUI 和 Firebase 创建一个聊天应用程序。我当前的方法涉及使用聊天室文档,并且每个聊天室中都有一个消息子集合。

因此,我使用两种不同的模型来获取聊天室数据和消息数据。首先,我获取有关聊天室的数据以进行列表视图。一旦用户单击其中一个聊天,就会触发一个 NavigationLink,将他们带到聊天的详细信息,也就是当我获取消息和数据时。

我想做的是跟踪发送的最后一条消息,以便可以从聊天室列表中看到它。目前这是通过从 NavigationLink 内部更新聊天室模型来完成的。由于我对来自 firebase 的数据有一个实时侦听器,因此这会触发父视图的更新,从而重新加载并关闭 NavigationLink。

我期望的行为是即使父视图更新也不要关闭 NavigationLink。

我将非常感谢任何帮助。

父视图

struct ChatListView: View {
var group: Group

@EnvironmentObject var sessionStore: SessionStore
@EnvironmentObject var groupModel: GroupModel

@ObservedObject var chatroomModel = ChatRoomModel()
@State var joinModal = false

init(group: Group) {
    self.group = group
    
    chatroomModel.fetchData(groupID: group.id)
}

var body: some View {
    NavigationView {
        ZStack {
            BackgroundView()
            
            VStack {
                ScrollView {
                    ForEach(chatroomModel.chatrooms) { chatroom in
                        NavigationLink (destination: ChatMessagesView(chatroom: chatroom, chatroomModel: chatroomModel)) {
                    (...)
                    }
                }
                .padding() …
Run Code Online (Sandbox Code Playgroud)

firebase swift google-cloud-firestore swiftui swiftui-navigationlink

5
推荐指数
0
解决办法
1182
查看次数

在 SwiftUI、iOS15、第二级 NavigationLink 中,isActive 不起作用

在iOS15中,它不起作用:

import SwiftUI
struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink {
                Dest1().navigationTitle("Dest1")
            } label: {
                Text("to Destination 1")
            }
        }
    }
}

struct Dest1: View {
    @State var dest2Active: Bool = false
    var body: some View {
        NavigationLink(
            destination: Button {
                dest2Active = false // not working!!
            } label: {Text("dismiss")} .navigationTitle("Dest2"),
            isActive: $dest2Active
        ) {Text("to Destination 2")}
    }
}
Run Code Online (Sandbox Code Playgroud)

dismiss里面的按钮不起作用Dest2!我记得在iOS14中,这段代码运行得很好。如何解决这个问题?

swiftui swiftui-navigationlink

5
推荐指数
2
解决办法
4367
查看次数

NavigationLink 不断将我的文本元素对齐到中心,而不是领先 SwiftUI

我有一个CustomSearchBar看起来像这样的视图 搜索栏

但是,当我用 包裹它时NavigationLink,占位符文本将居中。用户输入也将居中。

在此输入图像描述

使用时如何保持前导对齐NavigationLink

我的代码结构如下所示:

enum Tab {
 case social
}

struct MainAppView: View {
    @State var selection: Tab = .social
    var body: some View {
        TabView(selection: $selection) {
            ZStack{
                CustomButton()
                NavigationView { SocialView() }
               
            }.tabItem{Image(systemName: "person.2")}.tag(Tab.social)
            // other tabs....
        }

struct SocialView: View {
    // ...
    var body: some View {
        GeometryReader{ geometry in
            VStack{
                NavigationLink(destination: Text("test")) {  
                    CustomSearchBar()
                      //...
                    }.navigationBarHidden(true)
                    .navigationBarTitle(Text(""))
            }
        }
    }
}


struct CustomSearchBar: View {
    
    var body: some …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-navigationlink swiftui-navigationview

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

列表中 NavigationLink 的选择颜色在模拟器和设备 (SwiftUI) 中不同

我有一个列表,其中包含一些 NavigationLinks 作为 OutlineGroup:

\n
List {\n  OutlineGroup(bundle.topics, children: \\.children) { topic in\n    NavigationLink(destination: DetailView(topic: topic)) {\n      Label(topic.name, systemImage: topic.children != nil ? "folder" : "doc")\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题是 iPad Air 设备和 iPad Air 模拟器上的选择颜色不同。在模拟器上,选定的 NavigationLink 的背景颜色为灰色,并且公开指示器仍然可见。

\n

在此输入图像描述

\n

但在真正的 iPad Air 设备上,选择颜色为蓝色 \xe2\x80\x93 与显示指示器相同的蓝色,并且在选定的行上不可见。

\n

在此输入图像描述

\n

知道为什么颜色不同吗?我可以手动设置选择背景颜色吗?

\n

swiftui swiftui-list swiftui-navigationlink

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

SwiftUI 中的条件 onTapGesture

MyView我有一个导航链接,当根据编辑模式(或任何其他条件)点击其标签 ( ) 时,我需要不同的行为:

  1. 如果我们处于编辑模式,我想触发导航链接并显示DetailView所选模型。
  2. 如果我们处于编辑模式,我不想触发导航链接并EditingView在模式表中显示 。

这是我想出的一种实现方法:

NavigationLink(tag: model, selection: $displayedItem) {
    DetailView(model: model)
} label: {
    if editMode == .active {
        MyView()
            .onTapGesture {
                editingModel = model
            }
    } else {
        MyView()
    }
}
.sheet(item: $editingModel) { model in
    EditingView(model: model)
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是 if- 和 else- 分支中的视图具有不同的类型(由于修饰符onTapGesture),并且 SwiftUI 不会将它们识别为相同的视图。因此,动画无法插值并且无法正常工作。此外,每次切换MyView时总是会丢失其状态。editMode

(Chris Eidhof 对为什么会发生这种情况做了很好的解释:https://www.objc.io/blog/2021/08/24/conditional-view-modifiers/

所以我继续将 if 语句移动到onTapGesture修饰符内,如下所示,这样我就不会有两个不同的MyViews:

NavigationLink(tag: model, selection: $displayedItem) { …
Run Code Online (Sandbox Code Playgroud)

editmode ios swift swiftui swiftui-navigationlink

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

点击 NavigationSplitView 上的不同按钮时如何避免重建视图

我尝试过苹果示例 为您的 SwiftUI 应用程序带来强大的导航结构

所以我的代码看起来像这样

        NavigationSplitView(
            columnVisibility: $navigationModel.columnVisibility
        ) {
            List(
                categories,
                selection: $navigationModel.selectedCategory
            ) { category in
                NavigationLink(category.localizedName, value: category)
            }
            .navigationTitle("Categories")
            .toolbar {
                ExperienceButton(isActive: $showExperiencePicker)
            }
        } detail: {
            NavigationStack(path: $navigationModel.recipePath) {
                RecipeGrid(category: navigationModel.selectedCategory)
            }
        }
Run Code Online (Sandbox Code Playgroud)

详情查看

struct RecipeGrid: View {
    var category: Category?
    var dataModel = DataModel.shared

    var body: some View {
        ZStack {
            if let category = category {
                ScrollView {
                    LazyVGrid(columns: columns) {
                        ForEach(dataModel.recipes(in: category)) { recipe in
                            NavigationLink(value: recipe) {
                                RecipeTile(recipe: recipe)
                            }
                            .buttonStyle(.plain) …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack

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

如何知道 SwiftUI 演示何时完成?

我想知道我的 SwiftUI 视图何时完成其转换/动画,以便安全地呈现其他视图/模式。

例子:

我在视图 A 中显示工作表 A。在工作表 AI 中,点击一个按钮可关闭工作表 A、从视图 A 转换到视图 B,并在视图 B 的顶部显示工作表 B。

一个幼稚的实现,例如用真实的绑定/状态初始化视图 B 以显示工作表 B,将导致以下形式的错误:

[Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x107a03a00> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x107821800> (from <_TtGC7SwiftUI19UIHostingControllerVVS_19BridgedPresentation8RootView_: 0x107a1a200>) while a presentation is in progress.
Run Code Online (Sandbox Code Playgroud)

这意味着我们需要等待视图 B 完成其转换,然后才能呈现工作表 B。

我知道我可以...

  • ...添加 aNavigationStack/View.sheet()从工作表 A 导航到工作表 B。但是,为了向用户提供上下文,我希望将视图 B 放在工作表 B 后面。
  • ...在显示工作表 B 之前等待几毫秒,因此可能确保视图 B 已完成转换。例如
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
      // trigger sheet
    }
    
    Run Code Online (Sandbox Code Playgroud)

等待秒钟对我来说似乎非常不确定,这就是为什么我想知道是否有一个更优雅的解决方案来解决这个问题。

swiftui swiftui-navigationlink swiftui-animation swiftui-navigationview

5
推荐指数
0
解决办法
230
查看次数

无法使用 NavigationView 和 NavigationLink 在 SwiftUI 中弹出当前屏幕

因此,我在尝试弹出当前屏幕时遇到了有关SwiftUI中的NavigationViewNavigationLinks的问题,这在本例中不起作用。

我有 3 个屏幕 A -> B -> C

每个屏幕都有一个用于弹出自身的按钮。

从 B -> A 的弹出有效,但是当您从 A -> B -> C 导航时,从 C -> B 的弹出不起作用。

你知道会出现什么问题吗?我将附上下面的代码和视频。该应用程序应支持iOS 14

在此输入图像描述

struct ScreenA: View {
    @State private var showB = false
    
    var body: some View {
        NavigationView {
            VStack {
                Button("Go to B") {
                    showB = true
                }
                
                NavigationLink(destination: ScreenB(didTapGoBack: {
                    showB = false
                }), isActive: $showB) {
                    EmptyView()
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct ScreenB: View …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-navigationlink

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