gpt4 book ai didi

ios - 如何在功能运行时更改按钮的文本

转载 作者:行者123 更新时间:2023-11-28 21:26:27 26 4
gpt4 key购买 nike

我有以下函数,只要按下按钮就会运行:

func deletekeyPressed(sender: UIButton!) {

while(textDocumentProxy.hasText()) {
(textDocumentProxy as UIKeyInput).deleteBackward()
}

for _ in 1..<2000 {
(textDocumentProxy as UIKeyInput).deleteBackward()
}

}

为了防止用户认为程序正在崩溃,我希望删除按钮的文本通常显示“全部删除”到“正在删除...”,或者更好的是让标题在以下状态之间交替:“正在删除”, “正在删除。”、“正在删除……”、“正在删除……”

到目前为止,我已尝试在函数的开头和结尾为 UIControlState.Normal 放置一个 setTitle(),以使文本在该功能正在运行。

这使我的函数看起来像这样:

    func deletekeyPressed(sender: UIButton!) {
sender.setTitle("Deleting...", forState: .Normal)

while(textDocumentProxy.hasText()) {
(textDocumentProxy as UIKeyInput).deleteBackward()
}

for _ in 1..<2000 {
(textDocumentProxy as UIKeyInput).deleteBackward()
}

sender.setTitle("Deleting...", forState: .Normal)
}

然而,什么也没有发生。我如何实现此解决方案?

更新一:我是这样实现 Aaron 的解决方案的:

 func deletekeyPressed(sender: UIButton!) {

NSLog("-------------------")
NSLog("Pressing delete key")

sender.setTitle("Deleting...", forState: .Normal)
sender.userInteractionEnabled = false



dispatch_async(dispatch_get_main_queue()) {
NSLog("Starting delete function")

while(self.textDocumentProxy.hasText()) {
NSLog("Deleting 3 times")
(self.textDocumentProxy as UIKeyInput).deleteBackward()
(self.textDocumentProxy as UIKeyInput).deleteBackward()
(self.textDocumentProxy as UIKeyInput).deleteBackward()
}

for _ in 1..<2000 {
(self.textDocumentProxy as UIKeyInput).deleteBackward()
}

sender.setTitle("Clear", forState: .Normal)
sender.userInteractionEnabled = true

NSLog("Finishing delete function")
}

但是我遇到了以下问题。该解决方案部分起作用的原因是按钮文本会显示“正在删除...”,直到 dispatch_async 中的代码完成运行。但问题是,一旦 dispatch_async 中的代码运行完毕,正在删除文本的文本字段的 UI 不会立即更新。这会导致删除按钮的文本在短时间内显示“正在删除...”(只要代码完成运行所需的时间),即使 UITextfield 尚未更新自身以显示代码的更改。

这是问题的视频:

bugdemo

注意删除函数如何在屏幕更新之前完成调用。

最佳答案

问题是 UI 仅在主运行循环完成后绘制。因此,您更改文本的命令只有在工作完成后才会生效。

一个简单的解决方案是将删除工作安排在主队列的末尾:

func deletekeyPressed(sender: UIButton!) {
sender.setTitle("Deleting...", forState: .Normal)
sender.userInteractionEnabled = false

dispatch_async(dispatch_get_main_queue()) {
while(textDocumentProxy.hasText()) {
(textDocumentProxy as UIKeyInput).deleteBackward()
}

for _ in 1..<2000 {
(textDocumentProxy as UIKeyInput).deleteBackward()
}

sender.setTitle("Deleted!", forState: .Normal)
sender.userInteractionEnabled = true
}
}

关于ios - 如何在功能运行时更改按钮的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37957177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com