标签: swiftui-navigationlink

深度编程 SwiftUI NavigationView 导航

我正在尝试按顺序获得一个深层嵌套的编程导航堆栈。当手动完成导航(即:按下链接)时,以下代码按预期工作。当您按下Set Nav按钮时,导航堆栈确实发生了变化 - 但不像预期的那样 - 最终堆栈损坏[start -> b -> bbb],并且视图之间有很多翻转

class NavState: ObservableObject {
    @Published var firstLevel: String? = nil
    @Published var secondLevel: String? = nil
    @Published var thirdLevel: String? = nil
}

struct LandingPageView: View {

    @ObservedObject var navigationState: NavState

    func resetNav() {
        self.navigationState.firstLevel = "b"
        self.navigationState.secondLevel = "ba"
        self.navigationState.thirdLevel = "bbb"
    }

    var body: some View {

        return NavigationView {
            List {
                NavigationLink(
                    destination: Place(
                        text: "a",
                        childValues: [ ("aa", [ "aaa"]) ],
                        navigationState: …
Run Code Online (Sandbox Code Playgroud)

navigation swiftui ios-navigationview swiftui-navigationlink

7
推荐指数
1
解决办法
1533
查看次数

@EnvironmentObject 通过 navigationLink 不能很好地工作

我用我@EnvironmentObject的让我的 TeamData 可以被不同的人使用,但它不能很好地工作。当我通过列表中的导航链接转到另一个视图时,这很好。当我点击同一个视图的按钮时,它崩溃了..
我想我放错了什么。有人可以帮助解决这个问题吗?这是否意味着我需要先@EnvironmentObject在 NavigationView添加才能使用它?谢谢

演示:https : //youtu.be/-iRadrHd94c

import SwiftUI

struct GameRecordListView: View {
@EnvironmentObject var teamResult : TeamResult

@State var hint : String = ""
@State var successRegistration : Bool = false
@State var sheetPresented: Bool = false
var body: some View {
     VStack{

        List(0 ..< 12){ item in
            NavigationLink(destination: GameDetailRecordView()){   <-this works well
                Text("444")

            }
        }
        VStack{
            Spacer()
            HStack{
                Spacer()
                NavigationLink(destination: GameDetailRecordView())  <-this doesn't works well and crashed
                {
                    Image(systemName: "pencil.circle")
                        .resizable()
                        .frame(width: …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink

7
推荐指数
2
解决办法
1276
查看次数

如何从 SwiftUI 视图导航到 UIKit UIViewController

到目前为止,我有一个完全使用 UIKit 构建的应用程序。但是,我希望能够开始实现一些 SwiftUI 视图来替换一些 UIViewController。

我已经能够通过点击按钮从 UIViewController 导航到 SwiftUI 视图:

    @IBAction func buttonTapped(_ sender: Any) {
        let newView = UIHostingController(rootView: SwiftUIView(viewObj: self.view, sb: self.storyboard, dismiss: self.dismiss) )
        view.window?.rootViewController = newView
        view.window?.makeKeyAndVisible()
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何从单个 SwiftUI 视图过渡到 UIViewController?(因为应用程序的其余部分都在 UIKit 中)?我在 SwiftUI 视图中有一个按钮,可以在点击时导航回 UIViewController。我试过了:

  1. viewstoryboard对象传递给 SwiftUI 视图,然后调用执行类似于上面代码的操作来更改当前视图控制器。但是,在模拟器上尝试时没有任何反应。
  2. 使用.present以显示SwiftUI观模态。这有效,我可以允许 SwiftUI 视图.dismiss自己使用。但是,这只适用于模态,我希望使其正常工作(即更改屏幕)

这是我的简单 SwiftUI 视图:

struct SwiftUIView: View {
    var viewObj:UIView? // Perhaps use this for transition back?
    var sb:UIStoryboard?
    var dismiss: (() -> Void)?

    var …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller uikit swift swiftui swiftui-navigationlink

7
推荐指数
2
解决办法
3898
查看次数

SwiftUI 通过将 NavigationLink 标签设置为 nil 来关闭视图

我正在尝试在 SwiftUI 中实现编程视图弹出的逻辑

我在项目上设置了一个标签并为所选项目创建了一个相应的变量,但是当我单击 DetaiView 屏幕上的按钮时,没有任何反应。

如果我使用 VStack 而不是 List 或使用presentationMode环境变量来释放屏幕,问题就会消失,但我想使用List。

代码:

struct ContentView: View {
    
    @State var data: [Int] = [1, 2, 3, 4, 5]
    @State var selectedItem: Int? = nil
    
    var body: some View {
        NavigationView {
//            NavigationLink( // This make dismiss work
//                destination: DetailView(selectedItem: $selectedItem),
//                tag: 123,
//                selection: $selectedItem,
//                label: { Text("\(123)") }
//            )
            List { // VStack here make dismiss work
                ForEach(data, id: \.self) { element in
                    NavigationLink(
                        destination: DetailView(selectedItem: …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-list swiftui-navigationlink

7
推荐指数
1
解决办法
513
查看次数

SwiftUI - List / ForEach 与 NavigationLink 和 isActive 结合使用无法正常工作

我正在尝试在 SwiftUI 中的列表或 ForEach 循环中执行 NavigationLink。不幸的是,我得到了一个非常奇怪的行为(例如,当点击 Leo 时它会打开 Karl,Opening Max 也指向 Karl)。

我已经发现它与 NavigationLink 中的“isActive”属性有关。不幸的是,我需要它在此处实现此行为:https : //i.stack.imgur.com/g0BFz.gif此处也询问SwiftUI - Nested NavigationView: Go back to root

我还尝试使用选择和标签属性,但我无法实现“返回根目录”机制。

这是示例:


import SwiftUI


struct Model: Equatable, Hashable {
    var userId: String
    var firstName: String
    var lastName: String
}


struct ContentView: View {
    
    @State var navigationViewIsActive: Bool = false
    
    var myModelArray: [Model] = [
        Model(userId: "27e880a9-54c5-4da1-afff-05b4584b1d2f", firstName: "Leo", lastName: "Test"),
        Model(userId: "1050412a-cb12-4160-b7e4-2702ab8430c3", firstName: "Max", lastName: "Test"),
        Model(userId: "1050412a-cb12-4160-b7e4-2702ab8430c3", firstName: "Karl", lastName: "Test")] …
Run Code Online (Sandbox Code Playgroud)

foreach list swiftui swiftui-navigationlink

7
推荐指数
1
解决办法
1739
查看次数

SwiftUI NavigationLink 错误(SwiftUI 在推送导航链接时遇到问题。请提交错误。)

控制台错误: SwiftUI 在推送导航链接时遇到问题。请提交错误。

NavigationLink 中不使用 isActive 参数是没有问题的。但是,我必须使用 isActive 参数。因为我相应地关闭了下拉列表。

菜单型号:

struct Menu: Identifiable {
    var id: Int
    var pageName: String
    var icon: String
    var page: Any
    var startDelay: Double
    var endDelay: Double
//    var offsetY: CGFloat
}

let menu = [
    Menu(id: 1, pageName: "Profil", icon: "person.crop.circle", page: ProfileView(), startDelay: 0.2, endDelay: 0.6),
    Menu(id: 2, pageName: "Sepet", icon: "cart", page: CartView(), startDelay: 0.4, endDelay: 0.4),
    Menu(id: 3, pageName: "?stek", icon: "plus.circle", page: ClaimView(), startDelay: 0.6, endDelay: 0.2)
]
Run Code Online (Sandbox Code Playgroud)

菜单视图

struct …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink

7
推荐指数
1
解决办法
1699
查看次数

SwiftUI NavigationLink 自行弹出

我有一个简单的用例,其中一个屏幕使用NavigationLink. iOS 14.5 beta (1, 2, 3) 有一个奇怪的行为,推送的屏幕在被推送后就弹出。

我设法创建了一个示例应用程序,并在其中重现它。我相信原因是存在@Environment(\.presentationMode)似乎重新创建视图并导致弹出视图的原因。

完全相同的 cod 在 Xcode 12 / iOS 14.4 中运行良好

在此处输入图片说明

这是一个示例代码。

import SwiftUI

public struct FirstScreen: View {
    public init() {}
    public var body: some View {
        NavigationView {
            List {
                row
                row
                row
            }
        }
    }
    private var row: some View {
        NavigationLink(destination: SecondScreen()) {
            Text("Row")
        }
    }
}

struct SecondScreen: View {

    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    public var body: some View {
        VStack(spacing: 10) {
            NavigationLink(destination: …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink

7
推荐指数
4
解决办法
1047
查看次数

SwiftUI NavigationLink 自动弹出,这是出乎意料的

我在带有拆分视图(横向)的 iPad 上的 NavigationLink 遇到了一些问题。下面是一个例子:

屏幕录制

这是重现问题的代码:

import SwiftUI

final class MyEnvironmentObject: ObservableObject {
    @Published var isOn: Bool = false
}

struct ContentView: View {
    @EnvironmentObject var object: MyEnvironmentObject

    var body: some View {
        NavigationView {
            NavigationLink("Go to FirstDestinationView", destination: FirstDestinationView(isOn: $object.isOn))
        }
    }
}

struct FirstDestinationView: View {
    @Binding var isOn: Bool

    var body: some View {
        NavigationLink("Go to SecondDestinationView", destination: SecondDestinationView(isOn: $isOn))
    }
}

struct SecondDestinationView: View {
    @Binding var isOn: Bool

    var body: some View {
        Toggle(isOn: $isOn) …
Run Code Online (Sandbox Code Playgroud)

ios swiftui navigationlink swiftui-navigationlink

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

SwiftUI 在详细视图中覆盖导航栏外观

我有一个超级简单的 SwiftUI 主从应用程序:

import SwiftUI

struct ContentView: View {
    @State private var imageNames = [String]()

    var body: some View {
        NavigationView {
            MasterView(imageNames: $imageNames)
                .navigationBarTitle(Text("Master"))
                .navigationBarItems(
                    leading: EditButton(),
                    trailing: Button(
                        action: {
                            withAnimation {
                                // simplified for example
                                self.imageNames.insert("image", at: 0)
                            }
                        }
                    ) {
                        Image(systemName: "plus")
                    }
                )
        }
    }
}

struct MasterView: View {
    @Binding var imageNames: [String]

    var body: some View {
        List {
            ForEach(imageNames, id: \.self) { imageName in
                NavigationLink(
                    destination: DetailView(selectedImageName: imageName)
                ) {
                    Text(imageName) …
Run Code Online (Sandbox Code Playgroud)

swiftui uinavigationbarappearance swiftui-navigationlink

6
推荐指数
1
解决办法
1803
查看次数

为什么当放在 swiftUI 中的 NavigationView 内的元素上时 onAppear() 执行两次?(Xcode 12.0)

FirstView Appeared打印两次。首次加载视图时一次,选择 NavigationLink 时再次加载。

import SwiftUI

struct FirstView: View {
    
    var body: some View {
        NavigationView{
            ZStack{
                Text("FirstView").onAppear(perform: {print("FirstView Appeared")})
                
                NavigationLink(destination: SecondView()) {
                    Text("Goto SecondView")
                }.offset(y: 50)
            }
        }
    }
}

struct SecondView: View {
    
    var body: some View {

        Text("SecondView").onAppear(perform: {print("SecondView Appeared")})
    }
}
Run Code Online (Sandbox Code Playgroud)

在模拟器和个人设备上运行上面的代码在Xcode 12.0 beta中,在选择NavigationLink时,在下面的Xcode 12.0 Beta中会产生下面的输出:

FirstView Appeared
FirstView Appeared
SecondView Appeared
Run Code Online (Sandbox Code Playgroud)

这是 onAppear() 预期行为的重复吗?

如果是这样,有什么最佳实践可以在firstview创建时加载一些数据,然后返回到firstview(因为 onAppear() 会在导航离开时尝试加载一些数据firstView

navigation swiftui swiftui-navigationlink xcode12

6
推荐指数
1
解决办法
814
查看次数