Closed4

NavigationLinkを見てみる

mtkw0127mtkw0127

https://developer.apple.com/documentation/swiftui/navigationlink

NavigationLink(
        destination: {
            Text("Item at \(item.timestamp!, formatter: itemFormatter)")
        },
        label: {
            Text(item.timestamp!, formatter: itemFormatter)
        }
)

labelクロージャに渡したViewがリンクのViewとなる。
destinationクロージャに渡したViewがリンクタップ後にNavigationStackやNavigationSplitViewに表示されるViewとなる。

mtkw0127mtkw0127
@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プロトコルに準拠している。

mtkw0127mtkw0127
    public init(@ViewBuilder destination: () -> Destination, @ViewBuilder label: () -> Label)

NavigationLinkのinitializer。
destinationはDestinationを返すクロージャ。
labelはLabelを返すクロージャ。

DestinatioもLabelもどちらもViewを継承した何かなので何かViewを返せすクロージャを渡せば良いことがわかる。

mtkw0127mtkw0127

@ViewBuilderは何を意味している?

https://developer.apple.com/documentation/swiftui/viewbuilder

複数のViewを生成するclouserだと宣言するためのもの。

もし付いていない場合、例えばdestinationは単一のViewの生成をするclouserとして見なされるため、

NavigationLink(
    destination: { // @ViewBuilderがついていないと以下のようなことができず何かで囲む必要がある
        Text("Hello")
        Text("World")
    },
    label: {
        Text("Link")
    }
)
このスクラップは2024/08/16にクローズされました