首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法给NavigationLink添加一个额外的函数?SwiftUI

有没有办法给NavigationLink添加一个额外的函数?SwiftUI
EN

Stack Overflow用户
提问于 2020-03-05 23:37:55
回答 2查看 3.4K关注 0票数 8

我想给NavigationLink添加一个额外的函数。

示例代码如下所示:

代码语言:javascript
运行
复制
struct ContentView: View {

func yes () {
print("yes")
}

var body: some View {

NavigationView {
NavigationLink(destination: level1()) {

     Text("Next")      
}}}}

我知道这行不通,但有没有可能这样做呢?(转到目的地,同时调用函数)

代码语言:javascript
运行
复制
NavigationLink(destination: level1(), yes()) {Text("Next")}   

我试着把一个按钮放在NavigationLink里面,但也不起作用。当我这样做时,只有按钮中的函数有效,而NavigationLink不起作用。

代码语言:javascript
运行
复制
NavigationLink(destination: level1())   {
        Button(action: { self.yes() }) 
        { Text("Button")}
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-05 23:51:07

使用onAppear(perform:)。这将对View的出现执行一些功能。

代码语言:javascript
运行
复制
struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView().onAppear {
                self.someFunc()
            }) {
                Text("First Screen")
            }
        }
    }

    func someFunc() {
        print("Click")
    }
}

struct DetailView: View {
    var body: some View {
        Text("Second Screen")
    }
}
票数 22
EN

Stack Overflow用户

发布于 2021-11-24 16:09:53

适用于SwiftUI、iOS 15.1和Xcode 13.1的解决方案。

代码语言:javascript
运行
复制
import Foundation
import SwiftUI

// NavigationLink replacement with action
// Usage:
//var body: some View {
//  NavigationButton(
//      action: { print("tapped!") },
//      destination: { Text("Pushed View") },
//      label: { Text("Tap me") }
//  )
//}

struct NavigationButton<Destination: View, Label: View>: View {
        var action: () -> Void = { }
        var destination: () -> Destination
        var label: () -> Label

        @State private var isActive: Bool = false

        var body: some View {
                Button(action: {
                        self.action()
                        self.isActive.toggle()
                }) {
                        self.label()
                            .background(
                                ScrollView { // Fixes a bug where the navigation bar may become hidden on the pushed view
                                        NavigationLink(destination: LazyDestination { self.destination() },
                                                                                                 isActive: self.$isActive) { EmptyView() }
                                }
                            )
                }
        }
}

// This view lets us avoid instantiating our Destination before it has been pushed.
struct LazyDestination<Destination: View>: View {
        var destination: () -> Destination
        var body: some View {
                self.destination()
        }
}

我找不到原始代码,但这个解决方案非常适合我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60549028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档