- Примите во внимание, что навигационная ссылка может быть активирована без какого-либо «касания», программно или из меню действий и т. Д. c.
- Если у вас более одной навигационной ссылки, используйте правильный инициализатор, который дает вам возможность делать то, что вы хотите сделать
В настоящее время у нас есть три разных инициализатора, особенно третий может помочь в вашем случае.
/// A view that controls a navigation presentation.
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public struct NavigationLink<Label, Destination> : View where Label : View, Destination : View {
/// Creates an instance that presents `destination`.
public init(destination: Destination, @ViewBuilder label: () -> Label)
/// Creates an instance that presents `destination` when active.
public init(destination: Destination, isActive: Binding<Bool>, @ViewBuilder label: () -> Label)
/// Creates an instance that presents `destination` when `selection` is set
/// to `tag`.
public init<V>(destination: Destination, tag: V, selection: Binding<V?>, @ViewBuilder label: () -> Label) where V : Hashable
/// Declares the content and behavior of this view.
public var body: some View { get }
/// The type of view representing the body of this view.
///
/// When you create a custom view, Swift infers this type from your
/// implementation of the required `body` property.
public typealias Body = some View
}
В рабочем примере показано, как использовать его для «пользовательского стиля», но это может быть расширено для любого варианта использования (см. Распечатку в окне отладки).
import SwiftUI
class Model: ObservableObject {
@Published var selection: Int? {
willSet {
if let nv = newValue {
selected = nv
willChangeSelection?(selected)
}
}
}
var selected: Int = 0
let willChangeSelection: ((Int) -> Void)?
init( onSelection: ((Int)->Void)? ) {
willChangeSelection = onSelection
selection = 1
}
}
struct ContentView: View {
@ObservedObject var model = Model { i in
print("selected:", i)
}
var body: some View {
NavigationView {
List {
NavigationLink(destination: Detail(txt: "First"), tag: 1, selection: $model.selection) {
RowLabel(txt: "First", tag: 1, selected: model.selected)
}
NavigationLink(destination: Detail(txt: "Second"), tag: 2, selection: $model.selection) {
RowLabel(txt: "Second", tag: 2, selected: model.selected)
}
NavigationLink(destination: Detail(txt: "Third"), tag: 3, selection: $model.selection) {
RowLabel(txt: "Third", tag: 3, selected: model.selected)
}
}
.frame(width: 200, height: 300)
Detail(txt: "First")
}.frame(width: 500)
}
}
struct Detail: View {
let txt: String
var body: some View {
VStack {
Text(self.txt).font(.largeTitle)
}.frame(width: 300)
}
}
struct RowLabel: View {
let txt: String
let tag: Int
let selected: Int
var body: some View {
Text(txt)
.font(selected == tag ? .largeTitle: .footnote).padding(.leading, 10)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Полученный пример приложения в действии