Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在SwiftUI的NavigationView中处理选项卡视图的最佳方法_Ios_Swift_Swiftui_Navigationview_Tabview - Fatal编程技术网

Ios 在SwiftUI的NavigationView中处理选项卡视图的最佳方法

Ios 在SwiftUI的NavigationView中处理选项卡视图的最佳方法,ios,swift,swiftui,navigationview,tabview,Ios,Swift,Swiftui,Navigationview,Tabview,我正在用SwiftUI开发一个应用程序 我在NavigationView中放置了一个选项卡视图,并在选项卡视图中使用了navigationBarTitle。我这样做是因为如果我将NavigationView放在TabView中,当我转到NavigationLink时,我无法使选项卡栏消失:目前使用swiftUI似乎不可能做到这一点 当前设置的问题是,由于我将.navigationBarTitle放在选项卡视图上,因此当我更改选项卡视图时,标题不会更改,并且由于某种原因,我无法在子视图上重置.na

我正在用SwiftUI开发一个应用程序

我在NavigationView中放置了一个选项卡视图,并在选项卡视图中使用了navigationBarTitle。我这样做是因为如果我将NavigationView放在TabView中,当我转到NavigationLink时,我无法使选项卡栏消失:目前使用swiftUI似乎不可能做到这一点

当前设置的问题是,由于我将.navigationBarTitle放在选项卡视图上,因此当我更改选项卡视图时,标题不会更改,并且由于某种原因,我无法在子视图上重置.navigationBarTitle

下面是一个代码来解释我所说的:

ContentView:

NavigationView{
TabView{
SomeSubView().tabItem(){Text(“SomeSubView”)}
Text(“dummy2”).tabItem(){Text(“dummy2”)}
Text(“dummy3”).tabItem(){Text(“dummy3”)}
}.navigationBarTitle(“你好”)
}
子视图:

List(somearray){中的元素
NavigationLink(目标:elementDetails()){
SomeRowView()
}
}
这里是一个预览(上面的代码不完全是我的代码,只是一个示例):

现在我想将.navigationBarTitle放在SomeSubView()中,如下所示:

List(somearray){中的元素
NavigationLink(目标:elementDetails()){
SomeRowView()
}
}.navigationBarTitle(“标题2”)
而不是为选项卡视图选择全局标题。所以在这种情况下,我会有这样的想法:

NavigationView{
TabView{
SomeSubView().tabItem(){Text(“SomeSubView”)}
}
}
然后,我在SomeSubView()中选择了一个.navigationBarTitle,但它不起作用(标题栏不显示,而是选项卡标题被更改,这不是我想要的)

所以我最终想出了这样的设置:

@State private var title=Text(“默认标题”)
var body:一些观点{
导航视图{
TabView{
SomeSubView().tabItem{Text(“SomeSubView”)}.onAppear{self.title=Text(“new_title”)}
Text(“dummy2”).tabItem{Text(“dummy2”)}
Text(“dummy3”).tabItem{Text(“dummy3”)}
}.navigationBarTitle(标题)
}
}
通过这种方式,我可以在单击选项卡视图时动态更改标题,效果很好,但我还需要为每个选项卡视图设置不同的.navigationBarItems,因此我对.navigationBarItems的前导和尾随参数做了相同的操作,如下所示:

@State private var title=Text(“默认标题”)
@国有私有var领先=导航条领先(类型:“FirstView”)
@国家私有var跟踪=导航栏跟踪(类型:“FirstView”)
var body:一些观点{
导航视图{
TabView{
SomeSubView().tabItem{Text(“SomeSubView”)}.onAppear{
self.title=文本(“新标题”)
self.leading=NavBar\u leading(类型:“第一视图”)
self.training=NavBar\u training(类型:“FirstView”)
}
Text(“dummy2”).tabItem{Text(“dummy2”)}
Text(“dummy3”).tabItem{Text(“dummy3”)}
}.navigationBarTitle(标题).navigationBarItems(前导:前导,尾随:尾随)
}
}
如您所见,我动态更新了.navigationBarItems的前导和尾随参数,以便为每个选项卡视图设置不同的项(在本例中为按钮)。NavBar_前导视图和NavBar_尾随视图根据我传递的参数返回按钮文本类型,如下所示:

struct NavBar\u前导:视图{
变量类型:字符串
var body:一些观点{
如果类型==“FirstView”{
返回按钮(操作:{
打印(“hello1空”)
}) {
正文(“”)
}
}else if(类型==“第二视图”){
返回按钮(操作:{
打印(“hello2”)
}) {
文本(“SomeButton”)
}
}否则{
返回按钮(操作:{
打印(“hello3空”)
}) {
正文(“”)
}
}
}
}
现在的问题是,有时我想返回一个按钮文本,但有时从同一个导航栏前导视图返回一个按钮图像,但Swift不允许从同一视图返回不同的类型。我以为按钮视图是一种类型,但它似乎取决于你放在里面的内容,它变成了另一种类型

我听说Any视图类型在Swift中不是一个好的实践,它会影响性能,所以我正在寻找一种方法来实现我在这里想要的

我解释了一切,因为我愿意接受任何其他建议,比如如果我能做得更好,我愿意从头开始,所以我的问题如下:

  • 我在NavigationView中使用TabView是否是一个好主意?有更好的东西我不知道吗
  • 是否有其他方法可以为每个选项卡视图显示不同的标题,而不是像以前一样更新的全局标题
  • 是否有任何方法可以在不使用任何视图类型的情况下从视图返回不同的按钮类型?还有比这更好的吗
谢谢

这可能会对您有所帮助:谢谢。是我已经做过的更好的版本,它还展示了如何使用@ViewBuilder处理多返回类型,这比我的AnyView()解决方案要好得多。目前看来,这是实现这一目标的最佳解决方案。我有时会查看这篇文章,看看有没有人找到更好的。