英文:
SwiftUI TextFields with Integer
问题
在SwiftUI中,我有两个文本字段。其中一个是String,另一个应该是Int。我希望在“保存”功能之前和之后文本字段都为空。
这是我声明Int变量的方式:
@State private var newItemDays: Int?
这是文本字段:
TextField("任务标题", text: $newItemTitle)
.padding()
.background(Color.white)
TextField("倒计时天数", value: $newItemDays, formatter: NumberFormatter())
.keyboardType(.numberPad)
.padding()
.background(Color.white)
我的"确定"按钮保存它们:
Button("确定") {
if let days = newItemDays {
let newItem = CountdownItem(title: newItemTitle, daysLeft: days)
self.store.add(item: newItem)
newItemTitle = ""
newItemDays = 0
isTextFieldVisible = false
}
}
if语句始终返回false,即使我输入了整数。如果我删除声明中的可选项并将其设置为0,它可以正常工作,但这时文本字段中会显示0(它应该为空)。
有什么帮助吗?
英文:
In SwiftUI, I have two textfields. One of them is String and the other should be Int. And I want textfields to appear empty before and after "save" functionality.
this is how I declare my Int variable
@State private var newItemDays: Int?
this is the textfields
TextField("Task Title", text: $newItemTitle)
.padding()
.background(Color.white)
TextField("Days to Countdown", value: $newItemDays, formatter: NumberFormatter())
.keyboardType(.numberPad)
.padding()
.background(Color.white)
And my Ok button saves them.
Button("OK") {
if let days = newItemDays {
let newItem = CountdownItem(title: newItemTitle, daysLeft: days)
self.store.add(item: newItem)
newItemTitle = ""
newItemDays = 0
isTextFieldVisible = false
}
}
If statement always return false even though I put integer there. If I remove optional from the declaration and make it equal to 0, it works but this time I see 0 at the textfields (it should appear empty)
Any help?
答案1
得分: 1
你可以创建一个自定义的 NumberFormatter
并将 zeroSymbol
设置为空字符串:
let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.zeroSymbol = ""
return formatter
}()
然后你的 TextField
变成:
TextField("Days to Countdown", value: $newItemDays, formatter: formatter)
英文:
You can create a custom NumberFormatter
& set the zeroSymbol
to be an empty String
:
let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.zeroSymbol = ""
return formatter
}()
And your TextField
becomes:
TextField("Days to Countdown", value: $newItemDays, formatter: formatter)
答案2
得分: 1
使用 format:
替代 formatter:
TextField("倒计时天数", value: $newItemDays, format: .number)
当 value
是 Int?
时,初始状态会为空。
顺便提一下,不应该在 body
内初始化对象,这会导致内存泄漏,最好使用值类型。
英文:
Use format:
instead of formatter:
TextField("Days to Countdown", value: $newItemDays, format: .number)
When value
is Int?
it will appear empty initially.
By the way, you shouldn't init objects like NumberFormatter()
inside body
it is a memory leak, best stick to value types.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论