我正在嘗試獲取一個僅接受數字但也接受空值的文本欄位(即它是一個可選欄位)。這是文本欄位的樣子:
TextField("Phone Number", value: $phoneNumber, formatter: numberFormatter)
.disableAutocorrection(true)
.autocapitalization(.none)
我的數字格式化程式如下所示:
@State private var numberFormatter: NumberFormatter = {
var nf = NumberFormatter()
nf.numberStyle = .none
nf.zeroSymbol = ""
return nf
}()
我嘗試了兩種不同的解決方案,但都有問題。第一個解決方案是定義phoneNumber為可選整數Int?,以便TextField接受空白輸入:
@State var phoneNumber: Int? = nil
但是,這會與 混淆,TextField因此當我通過應用程式更改其值時,更改不會更新實際變數phoneNumber。所以,當我去發送我的資料時,phoneNumber仍然停留在nil. 我認為這與它有關numberFormatter,以及它如何不接受nil變數。
phoneNumber所以,我的第二個解決方案是像Int這樣初始化:
@State var phoneNumber: Int = 0
當phoneNumber我更改TextField. 但是,當我輸入 0 時,它只會在TextField框中顯示一個空格(因為我.zeroSymbol在 中的定義numberFormatter)。當我嘗試只放置一個空格(即洗掉所有文本)然后單擊退出時TextField,它只會恢復為之前的數字。當我在欄位中輸入一個非數字條目時也會發生同樣的事情,我可以接受,因為它應該只接受數字,但我仍然希望允許用戶包含一個空白條目。
我正在使用 XCode 并創建一個 iOS 應用程式。感謝您的任何幫助。
uj5u.com熱心網友回復:
一種可能的解決方案是通過代理系結攔截輸入/輸出,并執行所需的額外驗證/處理。

使用 Xcode 13.3 / iOS 15.4 測驗
這是主要部分:
TextField("Phone Number", value: Binding(
get: { phoneNumber ?? 0},
set: { phoneNumber = phoneNumber == $0 ? nil : $0 }
), formatter: numberFormatter)
專案中完整的測驗模塊
uj5u.com熱心網友回復:
我發現的另一個解決方案是phoneNumber使用 default 創建一個字串""。然后,通過嘗試將其轉換為Intvia來驗證它Int(phoneNumber)。如果Int(phoneNumber) == nil,則引發錯誤。否則,您現在有一個新的可選整數,可以是 nil 或提供的整數:
var intPhoneNumber: Int?
if phoneNumber == "" {
intPhoneNumber = nil
} else {
intPhoneNumber = Int(phoneNumber)
if intPhoneNumber == nil {
completion(.failure(.custom(errorMessage: "Please enter a valid phone number. Try again.")))
return
} else if intPhoneNumber! < 0 {
completion(.failure(.custom(errorMessage: "Invalid Phone Number. Please enter a valid 10 digit phone number.")))
return
} else if numberOfDigits(in: intPhoneNumber!) != 10 {
completion(.failure(.custom(errorMessage: "Invalid Phone Number. Please enter a valid 10 digit phone number.")))
return
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473514.html
