SwiftUI TextField 文字輸入教學

TextField 是最基本的輸入元件,與 Text 不同的是,它需要綁定一個變數來儲存使用者輸入的內容。

基礎綁定 (@State & Binding)

在 SwiftUI 中,輸入框的文字必須綁定到一個狀態變數 (@State)。這顯示了 SwiftUI "Single Source of Truth" (單一數據源) 的設計理念。

struct ContentView: View {
    @State private var name: String = "" // 1. 定義狀態變數

    var body: some View {
        VStack {
            TextField("請輸入你的名字", text: $name) // 2. 綁定到輸入框 (注意 $ 符號)
                .textFieldStyle(.roundedBorder) // 設定外觀樣式
                .padding()
            
            Text("你好,\(name)!") // 3. 顯示輸入的結果
        }
    }
}

當使用者打字時,name 變數會自動更新;反之,如果你用程式碼修改 name,輸入框的內容也會改變。

@State 是利用 Swift 的 屬性包裝器 Property Wrapper 語法。

鍵盤類型與處理

你可以指定輸入框適合的鍵盤類型,例如 Email、數字或密碼。

TextField("電子郵件", text: $email)
    .keyboardType(.emailAddress) // Email 鍵盤
    .textInputAutocapitalization(.never) // 關閉自動大寫
    .autocorrectionDisabled(true) // 關閉自動修正

密碼輸入 (SecureField)

對於密碼,請使用 SecureField 代替 TextField,它會隱藏輸入的文字。

SecureField("請輸入密碼", text: $password)
    .textFieldStyle(.roundedBorder)

聚焦控制 (FocusState)

在 iOS 15 之後,我們可以使用 @FocusState 來控制輸入框的聚焦狀態,或是實作「按下 Return 鍵收起鍵盤」的功能。

struct LoginView: View {
    @State private var username = ""
    @FocusState private var isFocused: Bool // 定義聚焦狀態

    var body: some View {
        TextField("使用者名稱", text: $username)
            .focused($isFocused) // 綁定聚焦狀態
            
        Button("收起鍵盤") {
            isFocused = false // 修改狀態即可控制鍵盤
        }
    }
}

多行輸入 (TextEditor)

如果你需要一個可以輸入多行文字的區域(類似 <textarea>),請使用 TextEditor

TextEditor(text: $bio)
    .frame(height: 200) // 通常需要給定高度
    .border(.gray, width: 1)

掌握文字輸入是製作互動式 App 的第一步。