Avatar
struct ItemView: View { @Binding var department: Department var storeIndex: Int var itemIndex: Int var body: some View { VStack { Text("price") TextField( "", value: $department.stores[storeIndex].items[itemIndex].price, format: .number ) .keyboardType(.decimalPad) } } } struct ContentView: View { @State private var path: NavigationPath = .init() @State private var department: Department = .init() var body: some View { NavigationStack(path: $path) { Button("Visit Store") { let newStore: Store = .init() department.stores.append(newStore) path.append(newStore) } .navigationDestination(for: Store.self) { store in let storeIndex = department.stores.firstIndex { $0.id == store.id }! Button("See Item") { let newItem: Item = .init() department.stores[storeIndex].items.append(newItem) path.append(newItem) } .navigationDestination(for: Item.self) { item in let itemIndex = department.stores[storeIndex].items.firstIndex { $0.id == item.id }! ItemView(department: $department, storeIndex: storeIndex, itemIndex: itemIndex) } } } } }
👀 1
10:27 PM
ItemViewを分ければ状態の変更が分断されるのでいけますね。
👀 1
10:27 PM
なんか navigationDestinationdestination ブロックは特別っぽいです。 (edited)
10:28 PM
いわゆる状態変化があったときのbodyの再評価以外のタイミングで呼ばれるんですよね。 (edited)
10:28 PM
let _ = Self._printChanges()
10:29 PM
を入れるとunchangedなのに呼ばれてしまいます。
10:29 PM
多分... そういう「仕様」のような気がしますね。
10:30 PM
通常、some View を返すような block をとる API は View の body の中で結果呼ばれることが多いんですが、そうなってない気がしますね。 (edited)
10:32 PM
まあ、SwiftUIのDSL的にどんどんネストできちゃうけど、View で全部切り出せっていうのが教えっちゃあ教えなのでそういう想定のAPIなのかなと思います。