【问题标题】:when click list item, open new SwiftUI for every list items in SwiftUI单击列表项时,为 SwiftUI 中的每个列表项打开新的 SwiftUI
【发布时间】:2021-03-31 23:37:50
【问题描述】:

我有一个简单的 SwiftUI 项目,当我单击任何列表项时,我想路由新视图。下面,我尝试将它用于设置和通知列表项,但它会抛出错误,我不知道为什么?我在互联网上搜索,但没有找到任何可以帮助我的解决方案。有什么想法吗?

内容视图:

import SwiftUI
struct ContentView: View {
var body: some View {
 NavigationView {
  List(contacts) { contact in
    NavigationLink(destination: SettingsView(contact: contact)) {
      ContactRow(contact: contact)
    }
  }
  .navigationBarTitle("Contacts")
 }
 .environment(\.colorScheme, .light)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
 }
}
 struct ContactRow: View {

 let contact: Settings

 var body: some View {
   HStack {
  Image(contact.imageName)
    .resizable()
    .aspectRatio(contentMode: .fill)
    .frame(width: 20, height: 20)
    
     
  VStack(alignment: .leading) {
    Text(contact.name)
      .font(.system(size: 21, weight: .medium, design: .default))
    }}}}

Settings.swift:

import SwiftUI
struct Settings: Identifiable {
let imageName: String
 let name: String
let id = UUID()
}
let contacts = [
Settings(imageName: "settings", name: "Settings"),
Settings(imageName: "notifications", name: "Notifications"),
]

设置视图:

struct SettingsView: View {

let contact: Settings

var body: some View {
  Text("hey")
}
}
struct SettingsView_Previews: PreviewProvider {
static var previews: some View {
    SettingsView(contact: contacts[0])
       }}

通知视图:

struct NotificationsView: View {

let contact: Settings

var body: some View {
  Text("hey")
}
}
struct NotificationsView_Previews: PreviewProvider {
static var previews: some View {
    NotificationsView(contact: contacts[1])
       }}

【问题讨论】:

  • 您遇到了哪个错误?
  • @Asperi,这是行不通的。
  • @Asperi 它总是跳转同一个视图,我想跳转新视图,当我点击新项目时
  • “它跳转到同一个视图”是什么意思?它会在列表中保留在您的视图中吗?
  • 还是跳转到显示“嘿”的视图。你想要一些不同的东西吗?

标签: swift swiftui


【解决方案1】:

我不太了解 NavigationView 的工作原理,相反我更喜欢使用 View Router 作为 env 对象进行导航。

@EnvironmentObject var viewRouter: ViewRouter
@ObservedObject var vm:RecordingsModelView

var body: some View {
    VStack(alignment: .center, spacing: 30, content: {
        
        Text("Recordings").font(.title).foregroundColor(Color("color_ekp"))
        
        List(vm.listOfRecordings) { recording in
            RecordingRow(recording: recording).onTapGesture {
                viewRouter.currentRecording = recording
                viewRouter.currentPage = .rec_detail
            }
        }
        .onAppear(){
            vm.loadRecordings()
        }
    }).padding()
}

ViewRouter

class ViewRouter: ObservableObject {
    
    @Published var currentPage: Page = .recordings
    
    // Custom
    @Published var currentRecording: RecordingEntity!
}

以及显示所选页面的根视图

struct RootView: View {
    
    @EnvironmentObject var viewRouter: ViewRouter
    
    var body: some View {
        switch viewRouter.currentPage {
        case .main:
            MainView()
        case .recordings:
            RecordingsView()
        case .rec_detail:
            RecDetailView(recording: viewRouter.currentRecording)
        }
    }
}

我还借此机会将一个对象传递到下一页,在本例中是从记录列表中选择的重新编码。

【讨论】:

  • 我怎样才能将它引入我的问题,tnx 来回答
  • 使用我建议的 ViewRouter 和 RootView,您不需要使用 NavigationView,您可以从代码的任何部分导航到所需的视图。嵌套导航视图似乎并不容易处理。
猜你喜欢
  • 2020-10-10
  • 1970-01-01
  • 2022-11-28
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多