Swiftui-打开新的视图按钮单击
noob在watchos和swiftui中。我创建了一个带有多个按钮的网格视图。每当单击一个按钮时,我都希望打开带有导航链接的新视图。由于视图上有多个按钮,因此我创建了一个可重复使用的视图,并且很难实现导航到下一个视图。以下是我的代码:
内容视图:
struct ContentView: View {
@Namespace var namespace
@State var selected: [MenuItem] = []
var body: some View {
MainMenuCircularGridView()
}
}
mainmenucularGridView:
struct MainMenuCircularGridView: View {
let columns = Array(repeating: GridItem(.fixed(72.0), spacing: 10), count: 2)
var body: some View {
NavigationView {
ScrollView {
let menuOptions = MenuOptions()
let menuOptionsAction = MenuActions()
LazyVGrid(columns: columns, spacing: 5) {
ForEach(menuOptions.menu) { item in
MenuItemCircularGridView(imageName: item.imageName, menuItemName: item.name, action: (menuOptionsAction.menuActions.first {$0.id == item.id})?.action ?? {})
}
}.padding()
}.navigationTitle("Sample App")
}
}
}
menuitemcirculargridview:
struct MenuItemCircularGridView: View {
var imageName: String = ""
var menuItemName: String = ""
var action: () -> Void
var body: some View {
VStack {
CircularButtonWithImage(imageName:imageName,
imageBackgroundColor:Color(red: 34 / 255, green: 34 / 255, blue: 34 / 255),
imageForegroundColor: Color(red: 23 / 255, green: 121 / 255, blue: 232 / 255),
imageFrameWidth: 30.0,
imageFrameHeight: 30.0,
imagePadding: 10.0,
action: action)
Text(menuItemName).font(.system(size: 10))
}.padding(10)
}
}
循环buttonwithimage:
struct CircularButtonWithImage: View {
var imageName: String = ""
var imageBackgroundColor: Color?
var imageForegroundColor: Color?
var imageFrameWidth: CGFloat = 0.0
var imageFrameHeight: CGFloat = 0.0
var imagePadding: CGFloat = 0.0
var action: () -> Void
var body: some View {
Button(action: { action() }) {
VStack{
Image(imageName)
.renderingMode(.template)
.resizable()
.scaledToFill()
.frame(width: imageFrameWidth, height: imageFrameHeight)
.padding(imagePadding)
.background(imageBackgroundColor)
.foregroundColor(imageForegroundColor)
.clipShape(Circle())
}
}
.buttonStyle(PlainButtonStyle())
}
}
这是我的应用的外观:
/hicyo.png“ rel =” nofollow noreferrer “ 这些按钮,我想打开带有导航链接的新视图。如下所示:
NavigationLink(destination: DetailView()) {
Text("Show Detail View")
}.navigationBarTitle("Navigation")
由于我将视图分解为多个可重复使用的文件,因此我不确定应该在哪里放置此逻辑以在单击按钮上打开新的视图。
编辑:添加我正在使用的硬编码数据。我试图将导航链接作为操作传递到按钮。
struct MenuOptions {
let menu: [MenuItem] = [
MenuItem(id: 0, name: "Option 1", imageName: "settings-gray"),
MenuItem(id: 1, name: "Option 2", imageName: "settings-gray"),
MenuItem(id: 2, name: "Option 3", imageName: "settings-gray"),
MenuItem(id: 3, name: "Set 1", imageName: "settings-gray"),
MenuItem(id: 4, name: "Set 2", imageName: "settings-gray"),
MenuItem(id: 5, name: "Settings", imageName: "settings-gray")
]
}
struct MenuActions {
let menuActions: [MenuItemAction] = [
MenuItemAction(id: 1, action: { NavigationLink("New View 1", destination: View1()) }),
MenuItemAction(id: 5, action: { NavigationLink("Settings", destination: SettingsView()) })
]
}
Noob in watchOS and SwiftUI. I have created a grid view with multiple buttons on it. Whenever a button is clicked, I wish to open a new view with navigation link. Since there are multiple buttons on the view, I have created a reusable view and having a hard time to implement navigation to next view. Below is my code:
Content View:
struct ContentView: View {
@Namespace var namespace
@State var selected: [MenuItem] = []
var body: some View {
MainMenuCircularGridView()
}
}
MainMenuCircularGridView:
struct MainMenuCircularGridView: View {
let columns = Array(repeating: GridItem(.fixed(72.0), spacing: 10), count: 2)
var body: some View {
NavigationView {
ScrollView {
let menuOptions = MenuOptions()
let menuOptionsAction = MenuActions()
LazyVGrid(columns: columns, spacing: 5) {
ForEach(menuOptions.menu) { item in
MenuItemCircularGridView(imageName: item.imageName, menuItemName: item.name, action: (menuOptionsAction.menuActions.first {$0.id == item.id})?.action ?? {})
}
}.padding()
}.navigationTitle("Sample App")
}
}
}
MenuItemCircularGridView:
struct MenuItemCircularGridView: View {
var imageName: String = ""
var menuItemName: String = ""
var action: () -> Void
var body: some View {
VStack {
CircularButtonWithImage(imageName:imageName,
imageBackgroundColor:Color(red: 34 / 255, green: 34 / 255, blue: 34 / 255),
imageForegroundColor: Color(red: 23 / 255, green: 121 / 255, blue: 232 / 255),
imageFrameWidth: 30.0,
imageFrameHeight: 30.0,
imagePadding: 10.0,
action: action)
Text(menuItemName).font(.system(size: 10))
}.padding(10)
}
}
CircularButtonWithImage:
struct CircularButtonWithImage: View {
var imageName: String = ""
var imageBackgroundColor: Color?
var imageForegroundColor: Color?
var imageFrameWidth: CGFloat = 0.0
var imageFrameHeight: CGFloat = 0.0
var imagePadding: CGFloat = 0.0
var action: () -> Void
var body: some View {
Button(action: { action() }) {
VStack{
Image(imageName)
.renderingMode(.template)
.resizable()
.scaledToFill()
.frame(width: imageFrameWidth, height: imageFrameHeight)
.padding(imagePadding)
.background(imageBackgroundColor)
.foregroundColor(imageForegroundColor)
.clipShape(Circle())
}
}
.buttonStyle(PlainButtonStyle())
}
}
This is kind of how my app looks:
Whenever I click on any of those buttons, I want to open a new view with navigation link. Something like below:
NavigationLink(destination: DetailView()) {
Text("Show Detail View")
}.navigationBarTitle("Navigation")
Since I have broken the view down into multiple reusable files, I am not sure where exactly should I put this logic to open a new view on button click.
Edit: Adding the hardcoded data that I am using. I was trying to pass navigation link as action to the button.
struct MenuOptions {
let menu: [MenuItem] = [
MenuItem(id: 0, name: "Option 1", imageName: "settings-gray"),
MenuItem(id: 1, name: "Option 2", imageName: "settings-gray"),
MenuItem(id: 2, name: "Option 3", imageName: "settings-gray"),
MenuItem(id: 3, name: "Set 1", imageName: "settings-gray"),
MenuItem(id: 4, name: "Set 2", imageName: "settings-gray"),
MenuItem(id: 5, name: "Settings", imageName: "settings-gray")
]
}
struct MenuActions {
let menuActions: [MenuItemAction] = [
MenuItemAction(id: 1, action: { NavigationLink("New View 1", destination: View1()) }),
MenuItemAction(id: 5, action: { NavigationLink("Settings", destination: SettingsView()) })
]
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
NavigationLink
必须在视图层次结构中,因此,不用采取行动,而需要将一些模型放在那里。可能的方法的草图目标
menuiteMaction
作为参数绑定到选择,并在内部分配目标,并将目的地分配给该绑定和
menuiteMaction
in相应menudestination
另请参见此帖子
A
NavigationLink
must be in view hierarchy, so instead of putting it in action we need to put some model there.A sketch of possible approach
MenuItemAction
take as argument binding to selection and internally assign destination to that bindingand
MenuItemAction
inited with case of correspondingMenuDestination
See also this post
我意识到我将视图分解为不同的文件可能会使事情变得更加复杂。由于我只有6个按钮,因此我决定将视图保存到一个文件中,并利用您创建Menudestation来传递正确视图的想法。在下面分享我的更新代码。
但是,我要使用NavigationLink的主要原因是在目标视图上获取“后退”按钮和导航标题名称以返回主菜单。我看不到目标视图左上方的带有导航标题的后退按钮。如果您对我可能缺少什么有了解,请告诉我。我的理解是使用NavigationLink自动将其添加到目标视图中。
更新的代码-MainmenucularGridViewNew:
菜单目标:
I realized me breaking down the views into different files was probably making things more complicated. Since I just have 6 buttons, I decided to keep the view into a single file and used your idea of creating MenuDestination for passing down the right view. Sharing my updated code below.
However the main reason I wanted to use NavigationLink is to get the back button button and navigation title name on the destination view to get back to the main menu. I am not seeing that back button with navigation title on top left of the destination view. Please do let me know if you have an idea of what I could be missing. My understanding is using NavigationLink automatically adds that to the destination view.
Updated code - MainMenuCircularGridViewNew:
Menu Destination: