看起来 Navigation + TabView + Sheet 在 iOS 15 中被破坏了。
当我这样做时:ContentView -> DetailView -> Bottom Sheet
当底部工作表出现时,Detail视图会自动从堆栈中弹出:
https://www.youtube.com/watch? v=gguLptAx0l4
我希望Detail即使底部工作表出现,视图也会保留在那里。有谁知道为什么会发生这种情况以及如何解决它?
这是我的示例代码:
import Combine
import SwiftUI
import RealmSwift
struct ContentView: View {
var body: some View {
NavigationView {
TabView {
TabItemView(num: 1)
.tabItem {
Text("One")
}
TabItemView(num: 2)
.tabItem {
Text("Two")
}
}
}
}
}
struct TabItemView: View {
private let num: Int
init(num: Int) {
self.num = num
}
var body: some View { …Run Code Online (Sandbox Code Playgroud) 由于本问题SwiftUI TabView 亮度视图垂直位置中概述的答案中概述的原因,我的应用程序的菜单结构是NavigationView-> TabView-> 具有不同导航标题的子视图。
问题是为.navigationTitle整个 TabView 提供一个导航标题,而不是为每个子视图提供一个导航标题。如何拥有多个导航标题TabView,每个子视图一个?
struct ContentView: View {
var body: some View {
NavigationView {
TabView {
Text("Hello")
.navigationTitle("Title One")
.tabItem {
Image(systemName: "square.stack")
}
Text("Hello Again")
.navigationTitle("Title Two")
.tabItem {
Image(systemName: "checkmark.square")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) swiftui swiftui-navigationlink swiftui-tabview swiftui-navigationview
每当我将设备旋转到横向并再次返回时,顶部 NavigationView(包括标题和后退按钮)都会被夹在状态栏下方。
struct ContentView: View {
var body: some View {
NavigationView {
ScrollView {
VStack {
ForEach(0..<15) { _ in
Text("Filler")
.frame(maxWidth: .infinity)
.background(Color.green)
.padding()
}
}
}
.navigationBarTitle("Data")
}
}
}
Run Code Online (Sandbox Code Playgroud)
只要内容是可滚动的,就会发生故障。我最初是在使用List. 如果我先单击一行,转到弹出视图,然后旋转设备,或者只是在主屏幕中旋转回来,都没有关系。
struct ContView: View {
let data = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen"]
var body: some View {
NavigationView {
List {
ForEach(data, id: \.self) { word in
NavigationLink(destination:
Text("Link")
) …Run Code Online (Sandbox Code Playgroud) I\xe2\x80\x99m 尝试添加嵌入导航栏中的附件视图标题下方导航栏中的附件视图,该视图可以在默认的 iOS 日历应用程序中看到(\xe2\x80\x9cs mtwtfs\xe2\x80\x9d 行)或GitHub 移动应用程序:
\n

我\xe2\x80\x99d 喜欢它与 GH mobile 等大型标题样式导航栏一起使用。
\nLazyVStack\xe2\x80\x99spinnedView带有节标题几乎可以工作,但我可以 \xe2\x80\x99t 获取背景颜色以使其与导航栏无缝连接,即使使用ultraThinMaterial. 它还在固定视图和栏之间留下了分隔线。
有没有办法实现这种布局?\n欢迎使用 SwiftUI、SwiftUI+ Introspect和 UIKit 中的解决方案!
\n当我从具有内联显示模式的推送视图中弹出时,最初较大的父视图的显示模式更改为内联,并且用户必须向下滚动标题才能恢复到其原始模式。
问:如何确保设置视图上始终显示大标题?
我使用的是 Xcode 14 beta 6,在预览中它不会发生,但在运行 iOS 16 的模拟器上它会发生。
struct SettingsView: View {
@State private var isPresentingChangePasswordView = false
var body: some View {
Form {
Section {
NavigationLink(destination: EmptyView()) {
Label("Account Details", systemImage: "person")
}
NavigationLink {
Form {
Button("Change Password") {
isPresentingChangePasswordView = true
}
}
.navigationTitle("Password & Security")
.navigationBarTitleDisplayMode(.inline)
} label: {
Label("Password & Security", systemImage: "lock")
}
NavigationLink(destination: EmptyView()) {
Label("Manage Subscription", systemImage: "crown")
}
Button {
} label: {
HStack {
Label …Run Code Online (Sandbox Code Playgroud) swift swiftui swiftui-navigationview ios16 swiftui-navigationstack
我们正在推动SwiftUI嵌入在土地中的视图,UIHostingViewController如下UIKit所示:
首先制作UIViewController:
func hostingController() -> UIViewController {
let swiftUIView = swiftUIView(viewModel: viewModel(data: [Data, Data, Data]))
return UIHostingController(rootView: swiftUIView)
}
Run Code Online (Sandbox Code Playgroud)
然后将其压入UINavigationView堆栈:
[self.navigationController pushViewController:hostingViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
这让我们进入了SwiftUI环境。但是,如果我们的SwiftUI环境有自己的带有NavigationView和的导航堆栈NavigationLink,则原始navigationBar的后退按钮只能导航回原始呈现UIViewController。
有没有办法将SwiftUI嵌入的视图推NavigationView送到现有UINavigationController堆栈上?
到目前为止,我们唯一的想法是UIHostingViewController为每个新SwiftUI屏幕创建一个新屏幕,并通过某种委托方法将其推送到堆栈上。
我们正在寻找的是这样的:
UINavigationStack: [UIViewController -> UIViewController -> SwiftUIView -> SwiftUIView]
Run Code Online (Sandbox Code Playgroud)
中的后退<箭头navigationBar将按预期运行。
如果我们可以进一步澄清,请告诉我们!
uinavigationcontroller swift swiftui swiftui-navigationlink swiftui-navigationview
我用来NavigationLink在NavigationView. 如何从导航堆栈中删除屏幕?不仅隐藏导航“后退”按钮,还从堆栈中完全删除屏幕?
例如,我有这样的屏幕链:A -> B -> C
如何删除屏幕B以返回C到A?
或者,另一个例子,如何删除 screenA和B,这样Cscreen 将成为根?
或者说这一切在 SwiftUI 的构想中都是不可能实现的?
当我将视图的主体嵌入到 a 中时,NavigationView我失去了在预览窗口中选择子视图的所有能力,以及选择代码以触发和显示预览中关联子视图周围的蓝色边框的反向能力。NavigationView无论我点击什么或点击哪里,它都只会在整个周围显示蓝色边框。这是一个错误吗?如果不是,我做错了什么?
编辑:根据下面评论的要求,这是一个简单的例子:
struct FooView: View {
var body: some View {
NavigationView {
VStack {
Label("Try")
Label("Selecting")
Label("These")
}
}
}
}
Run Code Online (Sandbox Code Playgroud) Form我在 a中有一个项目列表NavigationView,每个项目都有一个可以通过 访问的详细视图NavigationLink。当我向列表添加新元素时,我想显示其详细视图。为此,我使用 a@State var currentSelection接收NavigationLink为selection,每个元素的功能如下tag:
NavigationLink(
destination: DetailView(entry: entry),
tag: entry,
selection: $currentSelection,
label: { Text("The number \(entry)") })
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,当列表中的元素多于屏幕上显示的元素(再加上~2)时,它就会停止工作。问:为什么?我该如何解决这个问题?
我做了一个最小的例子来复制这种行为:
import SwiftUI
struct ContentView: View {
@State var entries = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
@State var currentSelection: Int? = nil
var body: some View { …Run Code Online (Sandbox Code Playgroud) 我在 SwiftUI 中遇到了一种奇怪的行为,我似乎无法解决它。
鉴于以下简单的示例应用程序,我遇到了这种行为:工具栏项目在初始运行时正确呈现,但导航离开并返回它会被剪切。
重新创建此示例代码:
内容视图.swift
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink(destination: View2()) {
Text("Hello, world!")
.padding()
.navigationTitle("View 1")
.toolbar {
Circle()
.fill(Color.red)
.frame(width: 150, height: 150, alignment: .center)
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Run Code Online (Sandbox Code Playgroud)
View2.swift
import SwiftUI
struct View2: View {
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct View2_Previews: PreviewProvider {
static var previews: some View …Run Code Online (Sandbox Code Playgroud) ios swift swiftui swiftui-navigationlink swiftui-navigationview