gpt4 book ai didi

ios - SwiftUI 工作表 : Inconsistent sheet behaviour with navigationBarItems

转载 作者:行者123 更新时间:2023-11-29 11:24:48 25 4
gpt4 key购买 nike

Xcode:版本 11.3 (11C29)
目标:运行iOS 13.3的模拟器

在使用工作表和 SwiftUI 时,我遇到了难以诊断的不一致行为。当我:
* 在 NavigationView 本身使用一个按钮,我可以始终调出工作表并将其关闭
* 使用 NavigationView 栏中的按钮(即 navigationBarItems),行为不一致:有时它会毫无问题地切换,有时它会“锁定”并且不响应约 10 秒,然后再次运行。在界面中四处滑动并执行其他操作似乎有助于“重置”功能。

最小可重现示例:

import SwiftUI

struct ContentView: View {
@State var isModalShowing = false

var body: some View {
NavigationView {
VStack {
List {
ForEach(1..<5) { number in
Text(String(number))
}
}
Button("First Modal Button") {
self.isModalShowing = true
}
}
.navigationBarItems(leading:
Button("Second Modal Button") {
self.isModalShowing = true
})
}
.sheet(isPresented: $isModalShowing) {
TestView(isPresented: self.$isModalShowing)
}
}
}

struct TestView: View {
@Binding var isPresented: Bool
var body: some View {
VStack {
Text("Hello SwiftUI!")
Button("Dismiss") {
self.isPresented = false
}
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

注意事项:
* 按第一个模式按钮始终有效
* 第一次关闭模态后,按 Second modal button 会出现不一致的情况(尝试连续使用此按钮 ~5-10 次,它应该会锁定,但很难预测何时会锁定)

已经有 a few StackOverflow 问题/answers about this ,但到目前为止没有一个对我有用,他们似乎在谈论 Xcode Betas,而我处于稳定状态(希望 11.3 稳定)。传递状态的不同方式(@Binding@Environment)没有帮助。在调用 .sheet 的地方移动也没有改变任何东西。我认为它也与 List 和/或 ForEach 有关,但我是 Swift 的新手,不确定如何进一步调试。

最佳答案

我认为这是一个错误。虽然我的回答不会解决这个问题,但可以为您提供考虑的选项。

出于好奇,我对 View 层次结构进行了一些调试。使用当前设置,最初导航栏按钮保留在这里(突出显示为蓝色):

enter image description here

然后您出示工作表并相应地取消工作表。解雇后,导航栏按钮的位置不太正确。参见:

enter image description here

按钮的 Text 保持在正确的位置,但条形按钮偏离了它应该在的位置。

但如果您使用 NavigationLink 而不是 .sheet 表示,则不会发生这种位移。

嗯,这个问题普遍存在于导航栏标题的 TitleDisplayModelarge 选项上,而且很长一段时间都是默认的。但是如果使用了inline选项,这个问题就不存在了。请看,使用 inline 选项,在关闭工作表之前和之后,导航栏按钮保持在同一位置:

enter image description here


这意味着,您现在有两个选择要考虑:

  1. 使用 NavigationLink 代替工作表演示。您可以通过将以下代码放在最外层的 View 中(在您的例子中是 VStack)来做到这一点:

    NavigationLink(destination: TestView(), isActive: self.$isModalShowing) {
    EmptyView()
    // no need to provide any other view as it will be triggered by the action
    // of navigation bar button item which already provides its own view
    }

Note: This NavigationLink option isn't tested with Xcode 11.3 or newer as navigation link seems to misbehave with this version. But works as expected upto Xcode 11.2.1. More on SwiftUI unable to navigate back and forth with navigationLink

  1. 使用导航栏TitleDisplayModeinline选项为:

    .navigationBarTitle(Text("Home"), displayMode: .inline)
    // you can get rid of the title "Home" with empty "" string though

关于ios - SwiftUI 工作表 : Inconsistent sheet behaviour with navigationBarItems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59494452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com