swift 如果视图在工作表中,则不显示键盘工具栏

1tu0hz3e  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(69)

有一个视图,我正在应用一个键盘定位的工具栏。如果我单独显示视图,工具栏会出现。如果视图在工作表中(通过.sheet修饰符),工具栏不会出现。
我想让工具栏出现在键盘和底部工作表之间。
我试过改变.toolbar修饰符应用到的视图。我在TextField上有它,但是即使应用到包含其他视图的VStack也没有什么作用。
下面是一些代码(简化):

struct CharInputModifier: ViewModifier {

    @Binding var char : String

    var textLimt = 1

    func limitText(_ upper : Int) {
        if char.count > upper {
            self.char = String(char.prefix(upper))
        }
    }

    func body(content: Content) -> some View {
        content
            .multilineTextAlignment(.center)
            .keyboardType(.numberPad)
            .onReceive(Just(char)) {_ in limitText(textLimt)}
            .font(.largeTitle)
            .frame(height: 100)
            .background(Color(.graySecondary).opacity(0.6))
            .cornerRadius(20)
            .overlay(
                RoundedRectangle(cornerRadius: 20)
                        .stroke(.gray, lineWidth: 1)
                        .opacity(0.5)
            )
    }
}

个字符
如果我只是将ManualDeviceCodeInput显示为一个独立的视图,它工作得很好。在工作表中,什么都不显示。
这里的想法是,设备是以字符(N/O)为前缀的,我试图在工具栏上显示带有两个字符选项的数字键盘。

lh80um4z

lh80um4z1#

在我运行iOS 17.2的模拟器上,当表单视图是主视图或工作表时,该工具栏会显示。这可能是早期版本中存在的问题。
为了获得最佳的工作机会,我建议稍微调整一下工具栏代码。不要将条件放在ToolbarItem周围,而是将条件移动到ToolbarItem内部。例如:

.toolbar {
  ToolbarItem(placement: .keyboard) {
    if fieldFocusState == .fieldOne {
      HStack {
        // etc
      }
    }
  }
}

字符串
根据我的经验,用.toolbar { ... }定义的@ToolbarContentBuilder块并不总是像它的ToolbarItem子组中的视图那样对状态更改做出响应,因此这是一种提高fieldFocusState中的更改触发重画的机会的方法。(例如,当if语句为false并且没有else替换时),项目不会占用任何空间-因此整体视觉效果应该相同。

相关问题