如何在SwiftUI中将NavigationLink显示为按钮

G. *_*arc 6 navigation swiftui

我在这里已经阅读了很多有关SwiftUI中导航的信息,并尝试了几件事,但是没有任何工作可以按需进行。

基本上,我有一个包含锻炼列表的视图,您可以通过单击一行来显示一个锻炼。使用NavigationView和NavigationLink可以按预期工作。

现在,我要在详细信息视图上单击一个按钮以开始锻炼。这应该打开一个带有计时器的视图。该视图应显示与详细视图相同的动画,并在导航栏中使用后退按钮显示锻炼的名称。

我可以在详细信息页面上的NavigationLink视图中实现此功能,但是该链接始终显示为全宽行,并在右侧显示箭头。我希望这是一个按钮,但是NavigationLink似乎可以抵抗样式。

struct WorkoutDetail: View {
    var workout: Workout

    var body: some View {
        VStack {
            NavigationLink(destination: TimerView()) {
                Text("Starten")
            }.navigationBarTitle(Text(workout.title))
        }
    }
}

struct WorkoutList: View {
    var workoutCollection: WorkoutCollection

    var body: some View {
        NavigationView {
            List(workoutCollection.workouts) { workout in
                NavigationLink(destination: WorkoutDetail(workout: workout)) {
                    WorkoutRow(workout: workout)
                }
            }.navigationBarTitle(Text("Workouts"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:这是一个截图,以说明我的意思:

在此处输入图片说明

ide*_*uch 23

我认为准确的方法是使用buttonStyle,例如

NavigationLink(destination: WorkoutDetail(workout: workout)) {
  WorkoutRow(workout: workout)
}
.buttonStyle(ButtonStyle3D(background: Color.yellow))
Run Code Online (Sandbox Code Playgroud)

  • 这正是我一直在寻找的。没有意识到您可以向导航链接添加按钮样式。哇!打算简化这么多代码! (2认同)
  • 这对于 SwiftUI 3 仍然有效吗?我仍然在最右侧看到“>”,但按钮本身已设计样式。 (2认同)

Sha*_*DES 17

我自己已经玩了几天了。我想这就是你要找的。

struct WorkoutDetail: View {
var workout: Workout

var body: some View {
    NavigationView {
       VStack {
           NavigationLink(destination: TimerView()) {
               ButtonView()
           }.navigationBarTitle(Text(workout.title))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并创建一个要在 NavigationLink 中显示的视图

struct ButtonView: View {
var body: some View {
    Text("Starten")
        .frame(width: 200, height: 100, alignment: .center)
        .background(Color.yellow)
        .foregroundColor(Color.red)
}
Run Code Online (Sandbox Code Playgroud)

注意: NavigationView 上方的任何内容似乎都会显示在 Navigation 的所有页面上,从而使 NavigationView 在链接中的大小变小。


yOs*_*shi 8

使用按钮标签内的 NavigationLink。

Button(action: {
    print("Floating Button Click")
}, label: {
    NavigationLink(destination: AddItemView()) {
         Text("Open View")
     }
})
Run Code Online (Sandbox Code Playgroud)

  • rbaldwin 我尝试了好几种情况,甚至在里面放了更多的组件,它工作正常。也许您可以上传这部分代码,以便我可以帮助您。 (2认同)

pin*_*god 8

Pankaj Bhalala的解决方案非常相似,但删除了 ZStack:

struct ContentView: View {
    @State var selectedTag: String?

    var body: some View {
        Button(action: {
            self.selectedTag = "xx"
        }, label: {
            Image(systemName: "plus")
        })
        .background(
            NavigationLink(
                destination: Text("XX"),
                tag: "xx",
                selection: $selectedTag,
                label: { EmptyView() }
            )
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

等待更简洁的没有状态的解决方案。你呢?


moh*_*wal 7

从Beta 6开始,您无需将视图包装在内NavigationLink即可使它在按下时触发导航。

我们可以将属性与我们绑定NavigationLink,只要我们更改该属性,无论执行什么操作,导航都会触发。例如-

struct SwiftUI: View {
    @State private var action: Int? = 0

    var body: some View {

        NavigationView {
                    VStack {
                        NavigationLink(destination: Text("Destination"), tag: 1, selection: $action) {
                            EmptyView()
                        }


                        Text("Your Custom View")
                            .onTapGesture {
                 //perform some tasks if needed before opening Destination view
                                self.action = 1
                        }
                    }
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

就这么简单。每当您更改Bindable属性的值(即操作)NavigationLink时,如果两者相等,则会将其预定义值tag与binded属性进行比较action

因此,您可以按照自己想要的方式创建视图,并且可以从任何视图触发导航,而无需考虑任何操作,只需将属性绑定为即可NavigationLink

谢谢,希望对您有所帮助。

  • 这是一个有趣的解决方案,解决了我们不应该在 Swift 中遇到的问题。当我在 Swift 5.2 中实现此功能时,偶尔会出现错误:SwiftUI 在推送 aNavigationLink 时遇到问题。请提交错误。 (6认同)

Pan*_*ala 5

您可以将 NavigationLink 用作 ZStack 的按钮:

@State var tag:Int? = nil
ZStack {
  NavigationLink(destination: MyModal(), tag: 1, selection: $tag) {
    EmptyView()
  }

  Button(action: {
    self.tag = 1
  }, label: {
    Text("show view tag 1")
  })
}
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助。


And*_*w K 5

我不知道为什么所有这些答案让事情变得如此复杂。在 SwiftUI 2.0 中,您只需在导航链接添加按钮即可!

NavigationLink(destination: TimerView()) {
    Text("Starten")
}
Run Code Online (Sandbox Code Playgroud)

您可以将 SwiftUI 样式应用于该Text对象,就像对任何其他元素设置样式一样。

  • 因为即使在 swiftui 2.0 中,您也会使用您的方法获得辅助箭头 (10认同)
  • 因为这是一个 SwiftUI 1.0 问题。 (6认同)