在没有导航的情况下更改视图 link SwiftUI
Change view without Navigation link SwiftUI
我各位!我花了几个小时寻找我认为非常简单的东西,但我无法找到最好的方法......
我有我的 body 观点:
var body: some View {
VStack {
// The CircularMenu
CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
.buttonStyle(PlainButtonStyle())
}
}
其中包含一个圆形菜单。每次点击菜单项调用:
func buttonClickHandler(_ index: Int) {
/// Your actions here
switch index {
//Thermometer
case 0:
print("0")
//Light
case 1:
print("1")
//Video
case 2:
print("2")
//Alarm
case 3:
print("3")
//Car
case 4:
self.destinationViewType = .car
self.nextView(destination: .car)
default:
print("not found")
}
}
我想执行到另一个名为 Car 的视图的简单视图转换。 nextView
函数如下所示:
func nextView(destination: DestinationViewType) {
switch destination {
case .car: Car()
}
}
我认为这很简单,但我在案例行中得到:Result of 'Car' initializer is unused
。
那么有人知道如何实现吗?提前致谢!
如果你想用新视图完全替换正文内容,你需要一些条件。假设您有一个 Container
和一个 body
,如果创建了一个 Car
视图,我们将显示它:
struct Container: View {
@State var car: Car? // Storage for optional Car view
var body: some View {
if let car = car { // if the car view exists
car // returning the car view
} else { // otherwise returning the circular menu
VStack {
CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
.buttonStyle(PlainButtonStyle())
}
}
}
...
然后我们只需要在点击时分配新创建的汽车视图实例:
...
func buttonClickHandler(_ index: Int) {
switch index {
....
//Car
case 4:
car = Car() // assigning the newly created instance
...
}
}
}
我看到你提到了 destinationViewTyp
和其他一些案例。所以你的代码会比这稍微复杂一点,但思路是一样的。我们存储视图或一些有助于我们在必要时创建视图的信息,然后根据条件返回选择器或视图。
这是一种方法:
创建一个名为 IdentifiableView
的 struct
,其中包含一个 AnyView
和一个 id
:
struct IdentifiableView: Identifiable {
let view: AnyView
let id = UUID()
}
创建一个 @State
变量来保存 nextView
。使用 .fullScreenCover(item:)
显示 nextView
@State private var nextView: IdentifiableView? = nil
var body: some View {
VStack {
// The CircularMenu
CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
.buttonStyle(PlainButtonStyle())
}.fullScreenCover(item: self.$nextView, onDismiss: { nextView = nil}) { view in
view.view
}
}
然后,分配 self.nextView
IdentifiableView
:
case .car: self.nextView = IdentifiableView(view: AnyView(Car()))
当需要 return 到 MenuView
时,使用 self.presentationMode.wrappedValue.dismiss()
关闭视图。这是一个最小 Car
视图的示例:
struct Car: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
Text("Car View").onTapGesture {
self.presentationMode.wrappedValue.dismiss()
}
}
}
我各位!我花了几个小时寻找我认为非常简单的东西,但我无法找到最好的方法...... 我有我的 body 观点:
var body: some View {
VStack {
// The CircularMenu
CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
.buttonStyle(PlainButtonStyle())
}
}
其中包含一个圆形菜单。每次点击菜单项调用:
func buttonClickHandler(_ index: Int) {
/// Your actions here
switch index {
//Thermometer
case 0:
print("0")
//Light
case 1:
print("1")
//Video
case 2:
print("2")
//Alarm
case 3:
print("3")
//Car
case 4:
self.destinationViewType = .car
self.nextView(destination: .car)
default:
print("not found")
}
}
我想执行到另一个名为 Car 的视图的简单视图转换。 nextView
函数如下所示:
func nextView(destination: DestinationViewType) {
switch destination {
case .car: Car()
}
}
我认为这很简单,但我在案例行中得到:Result of 'Car' initializer is unused
。
那么有人知道如何实现吗?提前致谢!
如果你想用新视图完全替换正文内容,你需要一些条件。假设您有一个 Container
和一个 body
,如果创建了一个 Car
视图,我们将显示它:
struct Container: View {
@State var car: Car? // Storage for optional Car view
var body: some View {
if let car = car { // if the car view exists
car // returning the car view
} else { // otherwise returning the circular menu
VStack {
CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
.buttonStyle(PlainButtonStyle())
}
}
}
...
然后我们只需要在点击时分配新创建的汽车视图实例:
...
func buttonClickHandler(_ index: Int) {
switch index {
....
//Car
case 4:
car = Car() // assigning the newly created instance
...
}
}
}
我看到你提到了 destinationViewTyp
和其他一些案例。所以你的代码会比这稍微复杂一点,但思路是一样的。我们存储视图或一些有助于我们在必要时创建视图的信息,然后根据条件返回选择器或视图。
这是一种方法:
创建一个名为 IdentifiableView
的 struct
,其中包含一个 AnyView
和一个 id
:
struct IdentifiableView: Identifiable {
let view: AnyView
let id = UUID()
}
创建一个 @State
变量来保存 nextView
。使用 .fullScreenCover(item:)
显示 nextView
@State private var nextView: IdentifiableView? = nil
var body: some View {
VStack {
// The CircularMenu
CircularMenu(menuItems: homeMenuItems, menuRadius: 55, menuButtonSize: 55, menuButtonColor: .black, buttonClickCompletion: buttonClickHandler(_:))
.buttonStyle(PlainButtonStyle())
}.fullScreenCover(item: self.$nextView, onDismiss: { nextView = nil}) { view in
view.view
}
}
然后,分配 self.nextView
IdentifiableView
:
case .car: self.nextView = IdentifiableView(view: AnyView(Car()))
当需要 return 到 MenuView
时,使用 self.presentationMode.wrappedValue.dismiss()
关闭视图。这是一个最小 Car
视图的示例:
struct Car: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
Text("Car View").onTapGesture {
self.presentationMode.wrappedValue.dismiss()
}
}
}