私はSwiftUIでのナビゲーションについてここでたくさん読んで、いくつかのことを試しましたが、期待どおりに機能するものはありません。
基本的に、ワークアウトのリストを含むビューがあり、行をクリックして1つのワークアウトを表示できます。これは、NavigationLinkと共にNavigationViewを使用して期待どおりに機能します。
ここで、詳細ビューのボタンでワークアウトを開始します。これにより、タイマー付きのビューが開きます。ビューには詳細ビューと同じアニメーションが表示され、戻るボタンのあるナビゲーションバーにワークアウトの名前も表示されます。
詳細ページの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"))
}
}
}
更新:これが私が何を意味するかを説明するスクリーンショットです:
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
}
}
}
}
}
とてもシンプルです。 Bindable
プロパティ(つまりアクション)の値を変更するたびに、NavigationLink
はそのtag
の事前定義値をバインドされたプロパティaction
と比較します。両方が等しい場合、ナビゲーションが行われます。
したがって、任意の方法でビューを作成し、アクションに関係なく、任意のビューからナビゲーションをトリガーできます。NavigationLink
でバインドされたプロパティを使用してください。
よろしくお願いいたします。
私はこれを数日間自分でいじっていました。これはあなたが探しているものだと思います。
struct WorkoutDetail: View {
var workout: Workout
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: TimerView()) {
ButtonView()
}.navigationBarTitle(Text(workout.title))
}
}
}
NavigationLinkに表示するビューを作成します
struct ButtonView: View {
var body: some View {
Text("Starten")
.frame(width: 200, height: 100, alignment: .center)
.background(Color.yellow)
.foregroundColor(Color.red)
}
注:NavigationViewの上にあるものはすべて、ナビゲーションのすべてのページに表示されているように見え、リンクのNavigationViewのサイズが小さくなっています。
それを行うための正確な方法は、たとえばbuttonStyle
を使用することだと思います。たとえば、
NavigationLink(destination: WorkoutDetail(workout: workout)) {
WorkoutRow(workout: workout)
}
.buttonStyle(ButtonStyle3D(background: Color.yellow))