Jas*_*ady 4 ios swift swiftui swiftui-navigationlink
我将尝试在这里概述我的案例,我想NavigationLink将其变成它自己的结构,以便我可以重新使用它。我使用的所有案例的内部都是相同的,只是文本和图像不同Label。NavigationLink我正在尝试使包含 的新结构NavigationLink具有我用于 的目标视图的参数NavigationLink。
我发现这个链接帮了我大部分忙,但我似乎无法完成最后一英里。
如何将一个 SwiftUI View 作为变量传递给另一个 View 结构
这是我制作的可重用NavigationLink结构:
struct MainMenuButtonView<Content: View>: View {
var imageName: String
var title: String
var description: String
var content: Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content()
}
var body: some View {
VStack {
NavigationLink(destination: content) {
Image(imageName)
.resizable()
.frame(width: 100, height: 100)
Text(title)
.font(.title)
Text(description)
.foregroundColor(Color(UIColor.systemGray2))
.multilineTextAlignment(.center)
.font(.footnote)
.frame(width: 175)
}
.buttonStyle(PlainButtonStyle())
}
}
}
Run Code Online (Sandbox Code Playgroud)
我目前在该部分没有收到任何错误,但这并不意味着它没有问题。
这就是我正在使用它的地方,目前,我只展示了一个,但一旦我让它工作,我就会有更多。
struct MainMenuView: View {
var body: some View {
NavigationView {
MainMenuButtonView(imageName: "List Icon",
title: "Lists",
description: "Auto generated shopping lists by store",
content: TestMainView(testText: "Lists"))
}
.buttonStyle(PlainButtonStyle())
.navigationBarTitle(Text("Main Menu"))
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我将其保留为上面时,它告诉我有一个额外的参数,并且无法推断“Contect”。Xcode 确实提供了修复,修复后它看起来像这样
MainMenuButtonView<Content: View>(imageName: "List Icon",
Run Code Online (Sandbox Code Playgroud)
但后来我收到一个错误,它无法在范围内找到“内容”。我知道我的问题和上面链接的示例之间的主要区别是我传递的视图也有参数。我不确定我是否也应该将所有参数放在 <> 内的标注中。
感谢您提供的任何帮助。
您需要更正init以下内容MainMenuButtonView:
struct MainMenuButtonView<Content: View>: View {
var imageName: String
var title: String
var description: String
var content: () -> Content // change to closure
// add all parameters in the init
init(imageName: String, title: String, description: String, @ViewBuilder content: @escaping () -> Content) {
self.imageName = imageName // assign all the parameters, not only `content`
self.title = title
self.description = description
self.content = content
}
var body: some View {
VStack {
NavigationLink(destination: content()) { // use `content()`
Image(imageName)
.resizable()
.frame(width: 100, height: 100)
Text(title)
.font(.title)
Text(description)
.foregroundColor(Color(UIColor.systemGray2))
.multilineTextAlignment(.center)
.font(.footnote)
.frame(width: 175)
}
.buttonStyle(PlainButtonStyle())
}
}
}
Run Code Online (Sandbox Code Playgroud)
另外,您需要将闭包传递给content参数(如您在 中所示init):
struct MainMenuView: View {
var body: some View {
NavigationView {
MainMenuButtonView(
imageName: "List Icon",
title: "Lists",
description: "Auto generated shopping lists by store",
content: { TestMainView(testText: "Lists") } // pass as a closure
)
.navigationBarTitle(Text("Main Menu"))
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11334 次 |
| 最近记录: |