导航栏中的 SwiftUI 元素不响应状态

Posted

技术标签:

【中文标题】导航栏中的 SwiftUI 元素不响应状态【英文标题】:SwiftUI Elements in Nav Bar Don't Respond to State 【发布时间】:2021-03-07 00:06:52 【问题描述】:

我的目标是当键盘可见时在 SwiftUI ios 应用程序的导航栏中显示一个按钮,并在键盘不可见时隐藏它。我可以使用视图主体内的按钮使其工作,但导航栏中的任何内容都不会响应我的 @State 变量。

这是一个示例项目:

struct ContentView: View 
  @State var showDone = false
  @State var text = "Testing"
  
  var body: some View 
    ZStack
      NavigationView 
          
        VStack
          ZStack
          .toolbar
            ToolbarItem(placement: .principal) 
              Text("Nav Bar")
            
            ToolbarItem(placement: .navigationBarTrailing) 
              Button(action: 
                hideKeyboard()
              )
                Text("Hide A")
              
              .opacity(showDone ? 1 : 0) //<-- This doesn't work
            
          

          //This is just for showing the keyboard when focused
          TextField("", text: $text)
            .textFieldStyle(RoundedBorderTextFieldStyle())

          //This button works correctly
          Button(action: 
            hideKeyboard()
          )
            Text("Hide B")
          
          .opacity(showDone ? 1 : 0)
        
        .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification))  _ in
          print("keyboard showing")
          showDone = true
        
        .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification))  _ in
          print("keyboard hidden")
          showDone = false
        
      
    
  

我有一个隐藏键盘的全局函数:

//Global function for hiding the keyboard
extension View 
  func hideKeyboard() 
    UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
  

我尝试将opacity 修饰符放在Text("Hide A")ButtonToolbarItem 本身上,但它们都不起作用(并且不允许将它放在ToolbarItem 上)编译器)。

有没有人遇到过导航栏的东西对@State 变量没有响应?

【问题讨论】:

【参考方案1】:

我想我是如此专注于让修饰符起作用,以至于我没有想到另一个明显的选择。这工作正常:

ToolbarItem(placement: .navigationBarTrailing) 
  if showDone
    Button(action: 
      hideKeyboard()
    )
      Text("Hide A")
    
  

【讨论】:

以上是关于导航栏中的 SwiftUI 元素不响应状态的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 3.1.1导航栏中相同高度的响应项目

如何在 bootstrap 3 导航栏中使 select2 v4 搜索框响应?

在弹出窗口的标签栏中取消导航控制器中的 UITableView 搜索后,UINavigationBar 无响应

在 Bootstrap 中禁用响应式(移动)导航栏

使用 SwiftUI 的 macOS 应用程序中的导航视图不稳定

从 SwiftUI 中的导航栏中删除后退按钮文本