У меня проблемы с переводом шаблонов архитектуры UIKit в SwiftUI. Моя текущая модель в основном MVVM с координаторами / маршрутизаторами. Часть MVVM кажется довольно простой и естественной с добавлением @ ObservableObject / @ Опубликовано. Но координация / маршрутизация кажется не интуитивной. Функции просмотра и координации (навигации) тесно связаны в SwiftUI. Кажется, что на самом деле невозможно отделить их от использования вспомогательной структуры AnyView
.
Вот один пример: я хочу создать повторно используемую строку / ячейку в SwiftUI. Допустим, этот ряд в Production довольно сложный, поэтому я хочу использовать его повторно. Я хочу поместить его также в другой модуль, чтобы я мог повторно использовать его в нескольких целях. (например, iOS, macCatalyst, et c ...)
Теперь я хочу контролировать, что происходит, когда пользователь нажимает на это вид или кнопки в этом представлении. В зависимости от контекста мне нужно ориентироваться в разных направлениях. Насколько я понимаю, возможные цели NavigationLink должны быть либо аппаратно в представлении, либо AnyView
должны быть переданы в представление.
Вот пример кода. Эта ячейка / строка содержит две кнопки. Я хочу перейти к некоторому другому представлению, которое зависит от контекста и не должно быть встроено в код:
struct ProductFamilyRow: View {
@State private var selection: Int? = 0
let item: ProductFamilyItem
let destinationView1: AnyView
let destinationView2: AnyView
var body: some View {
VStack {
NavigationLink(
destination: destinationView1,
tag: 1,
selection: self.$selection
) {
EmptyView()
}
NavigationLink(
destination: destinationView2,
tag: 2,
selection: self.$selection
) {
EmptyView()
}
HStack {
Text(item.title)
Button("Destination 1") {
self.selection = 1
}.foregroundColor(Color.blue)
Button("Destination 2") {
self.selection = 2
}.foregroundColor(Color.blue)
}
//Image(item.image)
}.buttonStyle(PlainButtonStyle())
}
}
Это, кажется, главный недостаток дизайна в SwiftUI. Повторно используемые компоненты с навигационными ссылками в принципе невозможны, кроме использования хака AnyView
. Насколько я знаю, AnyView
просто используется для конкретных c случаев, когда мне нужно стирание типа и у него есть некоторые недостатки производительности. Поэтому я не считаю это решением idiomati c для создания многократно используемых навигационных представлений с помощью SwiftUI.
Это действительно единственное решение? Может быть, я совершенно не прав, и это в любом случае неправильное направление. Я где-то читал (больше не могу найти пост ...) об использовании какого-то центрального состояния, которое указывает, какой вид показывать, но я не видел конкретного примера, как это сделать.
2-й вызов: Также я не хочу, чтобы ячейка реагировала на любые другие нажатия, кроме кнопок. Но, кажется, невозможно контролировать, куда перемещается ячейка, если нажать. (не нажимая ни на одну из кнопок, но в любом месте ячейки) В текущем примере кода он (по любой причине) перемещается к «Пункту назначения 2».
Заранее спасибо.