我尝试了 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
您可以在 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)
如果它不能像上面尝试的那样工作,是否有其他方法可以实现预期的结果?
我正在尝试使用 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
在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中,这段代码运行得很好。如何解决这个问题?
但是,当我用 包裹它时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) 我有一个列表,其中包含一些 NavigationLinks 作为 OutlineGroup:
\nList {\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}\nRun Code Online (Sandbox Code Playgroud)\n我的问题是 iPad Air 设备和 iPad Air 模拟器上的选择颜色不同。在模拟器上,选定的 NavigationLink 的背景颜色为灰色,并且公开指示器仍然可见。
\n\n但在真正的 iPad Air 设备上,选择颜色为蓝色 \xe2\x80\x93 与显示指示器相同的蓝色,并且在选定的行上不可见。
\n\n知道为什么颜色不同吗?我可以手动设置选择背景颜色吗?
\nMyView我有一个导航链接,当根据编辑模式(或任何其他条件)点击其标签 ( ) 时,我需要不同的行为:
DetailView所选模型。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) 我尝试过苹果示例 为您的 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
我想知道我的 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。
我知道我可以...
NavigationStack/View并.sheet()从工作表 A 导航到工作表 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
因此,我在尝试弹出当前屏幕时遇到了有关SwiftUI中的NavigationView和NavigationLinks的问题,这在本例中不起作用。
我有 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) swiftui ×10
swift ×6
ios ×2
swiftui-list ×2
editmode ×1
firebase ×1