我尝试过苹果示例 为您的 SwiftUI 应用程序带来强大的导航结构
所以我的代码看起来像这样
NavigationSplitView(
columnVisibility: $navigationModel.columnVisibility
) {
List(
categories,
selection: $navigationModel.selectedCategory
) { category in
NavigationLink(category.localizedName, value: category)
}
.navigationTitle("Categories")
.toolbar {
ExperienceButton(isActive: $showExperiencePicker)
}
} detail: {
NavigationStack(path: $navigationModel.recipePath) {
RecipeGrid(category: navigationModel.selectedCategory)
}
}
Run Code Online (Sandbox Code Playgroud)
详情查看
struct RecipeGrid: View {
var category: Category?
var dataModel = DataModel.shared
var body: some View {
ZStack {
if let category = category {
ScrollView {
LazyVGrid(columns: columns) {
ForEach(dataModel.recipes(in: category)) { recipe in
NavigationLink(value: recipe) {
RecipeTile(recipe: recipe)
}
.buttonStyle(.plain) …Run Code Online (Sandbox Code Playgroud) swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack
我想知道我的 SwiftUI 视图何时完成其转换/动画,以便安全地呈现其他视图/模式。
例子:
我在视图 A 中显示工作表 A。在工作表 AI 中,点击一个按钮可关闭工作表 A、从视图 A 转换到视图 B,并在视图 B 的顶部显示工作表 B。
一个幼稚的实现,例如用真实的绑定/状态初始化视图 B 以显示工作表 B,将导致以下形式的错误:
[Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x107a03a00> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x107821800> (from <_TtGC7SwiftUI19UIHostingControllerVVS_19BridgedPresentation8RootView_: 0x107a1a200>) while a presentation is in progress.
Run Code Online (Sandbox Code Playgroud)
这意味着我们需要等待视图 B 完成其转换,然后才能呈现工作表 B。
我知道我可以...
NavigationStack/View并.sheet()从工作表 A 导航到工作表 B。但是,为了向用户提供上下文,我希望将视图 B 放在工作表 B 后面。DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
// trigger sheet
}
Run Code Online (Sandbox Code Playgroud)
等待几秒钟对我来说似乎非常不确定,这就是为什么我想知道是否有一个更优雅的解决方案来解决这个问题。
swiftui swiftui-navigationlink swiftui-animation swiftui-navigationview
因此,我在尝试弹出当前屏幕时遇到了有关SwiftUI中的NavigationView和NavigationLinks的问题,这在本例中不起作用。
我有 3 个屏幕 A -> B -> C
每个屏幕都有一个用于弹出自身的按钮。
从 B -> A 的弹出有效,但是当您从 A -> B -> C 导航时,从 C -> B 的弹出不起作用。
你知道会出现什么问题吗?我将附上下面的代码和视频。该应用程序应支持iOS 14。
struct ScreenA: View {
@State private var showB = false
var body: some View {
NavigationView {
VStack {
Button("Go to B") {
showB = true
}
NavigationLink(destination: ScreenB(didTapGoBack: {
showB = false
}), isActive: $showB) {
EmptyView()
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
struct ScreenB: View …Run Code Online (Sandbox Code Playgroud) 我正在开发一个蓝牙应用程序。它有入门和仪表板。在入门上有关于如何使用模块的配对和说明,仪表板控制外围设备。所以我需要使用警报取消配对并将其导航到一个名为Onboarding的不同页面。如何使用警报导航到不同的视图。
代码块
import SwiftUI
import BLE
struct Dashboard: View {
@EnvironmentObject var BLE: BLE
@State private var showUnpairAlert: Bool = false
@State private var hasConnected: Bool = false
let defaults = UserDefaults.standard
let defaultDeviceinformation = "01FFFFFFFFFF"
struct Keys {
static let deviceInformation = "deviceInformation"
}
var body: some View {
VStack(alignment: .center, spacing: 0) {
// MARK: - Menu Bar
HStack(alignment: .center, spacing: 10) {
VStack(alignment: .center, spacing: 4) {
Text(self.hasConnected ? "PodId \(checkForDeviceInformation())":"Pod is not connected")
.font(.footnote) …Run Code Online (Sandbox Code Playgroud) 我注意到,编辑模式下的 SwiftUI 列表行不允许按钮操作起作用(以及导航链接)。有没有办法让这个工作?
目标- 希望根据编辑模式对以下内容具有 NavigationLink 或 Modal 视图。这依赖于让按钮操作/导航链接在编辑模式下工作的能力。(如果有另一种方式来实现我的目标很高兴有指点)
代码(只是为了突出显示按钮在编辑模式下不起作用):
List() {
ForEach(gcLists) { gcList in
HStack {
Button(gcList.title) {
print("button pressed!")
}
}
}
.onDelete(perform: deleteList)
.onMove(perform: move)
}
Run Code Online (Sandbox Code Playgroud) 我试图为我的 ListView 提供一个背景图像,该图像不应适用于每个单元格。因此整个视图只需一张图像。我尝试添加.background(Image("nameOfImage))为列表修饰符但没有执行任何操作。
NavigationView {
List(elements) { element in
NavigationLink(destination: NextView) {
Text(element.name)
Image(element.image)
}
}.background(Image("nameOfImage"))
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过 ZStack,但我认为该列表覆盖了我的图像
那么如何将图像作为列表背景或视图背景(上面的代码是整个视图)
在 SwiftUI 中,当 NavigationLink 放置在 Form 内时,NavigationLink 的尾部会自动出现一个箭头。这个箭头的颜色怎么改?
struct example: View {
var body: some View {
NavigationView {
Form {
NavigationLink(destination: Text("Example destination")) {
Text("Example link")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我对SwiftUI有一系列的看法。一种是“菜单视图”,它由包装在导航视图中的导航链接列表组成。
代码如下。
var body: some View {
NavigationView {
List {
HStack {
NavigationLink(destination: History(), isActive: $isHistoryViewActive) {
Image(systemName: "clock")
Text("History")
}
}
HStack {
NavigationLink(destination: Settings(), isActive: $isSettingsActive) {
Image(systemName: "gear")
Text("Settings")
}
}
HStack {
Image(systemName: "info.circle.fill")
Button(action: {
...
}) {
Text("My Button")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
设置视图如下
var body: some View {
List {
...
Section(header: "Background Music") {
Toggle("Play", isOn: $isBackGroundMusicOn)
}
Section(header: "Voice Setting") {
HStack {
NavigationLink(destination: …Run Code Online (Sandbox Code Playgroud) ios swiftui swiftui-list swiftui-navigationlink swiftui-navigationview
我将尝试在这里概述我的案例,我想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) 导航到 INCR: 3 并点击导航栏后退按钮或关闭按钮,您会注意到再次调用相同的视图,但这次是新版本,因为 和onAppear firstLoad = true是rand不同的值。
如果您注释掉@Environment(\.dismiss) var dismiss,dismiss()一切都会像 iOS 14 中那样按预期工作。此问题也会发生在@Environment(\.presentationMode) var presentationMode
不确定这是一个错误还是我犯了一个愚蠢的错误,但这个问题给我的应用程序带来了很多问题,因为我必须能够以编程方式关闭视图,因此任何输入都会受到赞赏。
struct DetailView: View {
@Environment(\.dismiss) var dismiss
@State var isPresenting = false
@State var incrInt = 0
@State var firstLoad = true
@State var rand = Int.random(in: 1..<500)
var body: some View {
Text("INCR: \(incrInt) RAND: \(rand)")
Button("NAVIGATE"){
isPresenting = true
}
Button("DISMISS"){
dismiss()
}
.onAppear(perform: {
if firstLoad{
print("ON APPEAR FIRST LOAD")
print(incrInt) …Run Code Online (Sandbox Code Playgroud) swiftui ×10
ios ×6
swift ×6
swiftui-list ×3
ios15 ×1
iphone ×1
swift5.1 ×1