Closed4
NavigationLinkを見てみる

NavigationLink(
destination: {
Text("Item at \(item.timestamp!, formatter: itemFormatter)")
},
label: {
Text(item.timestamp!, formatter: itemFormatter)
}
)
labelクロージャに渡したViewがリンクのViewとなる。
destinationクロージャに渡したViewがリンクタップ後にNavigationStackやNavigationSplitViewに表示されるViewとなる。

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public struct NavigationLink<Label, Destination> : View where Label : View, Destination : View {
このように定義されている。ざっくり以下と理解。
Viewを継承したLabelとDestinationをGeneric型として受け取る。
LabelとDestinatiはViewプロトコルに準拠している。
NavigationはViewプロトコルに準拠している。

public init(@ViewBuilder destination: () -> Destination, @ViewBuilder label: () -> Label)
NavigationLinkのinitializer。
destinationはDestinationを返すクロージャ。
labelはLabelを返すクロージャ。
DestinatioもLabelもどちらもViewを継承した何かなので何かViewを返せすクロージャを渡せば良いことがわかる。

@ViewBuilderは何を意味している?
複数のViewを生成するclouserだと宣言するためのもの。
もし付いていない場合、例えばdestinationは単一のViewの生成をするclouserとして見なされるため、
NavigationLink(
destination: { // @ViewBuilderがついていないと以下のようなことができず何かで囲む必要がある
Text("Hello")
Text("World")
},
label: {
Text("Link")
}
)
このスクラップは2024/08/16にクローズされました