SwiftUI中如何在键盘弹出时条件性显示不同视图
解决SwiftUI中键盘弹出时切换视图的问题
要实现点击TextField弹出键盘时切换显示不同视图,你可以按以下步骤修改代码:
- 添加状态变量跟踪键盘状态
在ContentView中新增一个@State变量,用来记录键盘是否可见:
@State private var isKeyboardVisible = false
- 监听键盘通知更新状态
先导入UIKit框架,再通过.onReceive修饰符监听键盘的显示/隐藏通知,更新isKeyboardVisible的值:
import UIKit
在外层VStack上添加监听逻辑:
.onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)) { _ in isKeyboardVisible = true } .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)) { _ in isKeyboardVisible = false }
- 修正视图切换逻辑
替换代码中的注释判断,同时修正原代码里多余的大括号语法错误。
完整修改后的代码如下:
import SwiftUI import UIKit struct ContentView: View { @State private var text = "" @State private var isKeyboardVisible = false var body: some View { VStack { Spacer() if isKeyboardVisible { Text("Keyboard is shown") } else { VStack(alignment: .center, spacing: 16) { Text("Enter prompts") .font(.custom("Avenir Next Medium", size: 18)) .foregroundColor(.white) .padding(.trailing, 230) TextField(text: $text) { Text("Enter text here") } .frame(height: 120) .cornerRadius(10) .background(Color.gray.opacity(0.2)) // 可选:添加背景色提升TextField辨识度 Text("create") .opacity(text.isEmpty ? 0.4 : 1) } .padding(.horizontal) } } .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)) { _ in isKeyboardVisible = true } .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)) { _ in isKeyboardVisible = false } } }
补充说明
- 给TextField补充了占位符,让交互逻辑更清晰;
- 可选的背景色可以让TextField在浅色背景下更易识别;
- 键盘通知监听需绑定在外层容器上,确保能稳定接收通知。
内容的提问来源于stack exchange,提问作者Pavlo Kupyn
相关产品推荐
相关产品推荐

