在swift中,如何在用戶停止鍵入文本框後1秒鐘運行某些代碼?有textFieldDidChange
,但是會在輸入新字符後立即運行代碼。SWIFT - 在用戶停止鍵入文本框後1秒鐘運行代碼
回答
在textFieldDidEndEditing(_ :),回覆之前結束,加入這行代碼:
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
doSomething()
}
或
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
doSomething()
}
如果你想要做一些事情的UserInterface
(UI )(顯示新視圖,移動框架,開始動畫)
試着用這個自定義UITextField
,你需要設置一個計時器1秒用戶每次把一個角色在你的UITextField
,並再次失效重新安排前計時器,我加入了行動,關閉允許任何的動作,充分的自由在你執行
增加檢查屬性對於延遲定製
import UIKit
@IBDesignable
class AfterOneSecondTextField: UITextField {
@IBInspectable var delayValue : Double = 1.0
var timer:Timer?
var actionClosure : (()->Void)?
override func awakeFromNib() {
super.awakeFromNib()
self.addTarget(self, action: #selector(changedTextFieldValue), for: .editingChanged)
}
func changedTextFieldValue(){
timer?.invalidate()
//setup timer
timer = Timer.scheduledTimer(timeInterval: delayValue, target: self, selector: #selector(self.executeAction), userInfo: nil, repeats: false)
}
func executeAction(){
actionClosure?()
}
/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
// Drawing code
}
*/
}
使用它
你只需要設置類和閉合傳遞給我的情況你的期望動作是debugPrint但你可以做任何喲u需要
class ViewController: UIViewController {
@IBOutlet weak var tfText: AfterOneSecondTextField!
override func viewDidLoad() {
super.viewDidLoad()
tfText.actionClosure = {
debugPrint("Test")
}
}
這個工作!測試
希望這有助於
我所做的是用一個取消關閉一些延遲後運行代碼;就像用戶輸入閉包的方式一直被取消一樣,但是當它們停頓了足夠長時間或者完成搜索或提取的代碼實際上是在短暫的延遲之後運行的。
我用取消關閉代碼從這裏:
Cancel a timed event in Swift?
然後就是進入textFieldDidChange代碼如下:
fileprivate var delayedSearchClosure : dispatch_cancelable_closure?
open func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if let searchClosure = delayedSearchClosure {
searchClosure(true)
delayedSearchClosure = .none
}
delayedSearchClosure = delayClosure(0.8) { [weak self] in
self?.doSearch(searchText)
self?.delayedSearchClosure = .none
}
}
爲了解釋這裏發生了什麼 - 在回調作爲用戶類型的文本字段,我首先終止創建在特定時間運行的現有閉包。然後在下一個代碼塊中,它會創建一個新的delayedSearchClosure,它將從現在開始執行0.8秒,並調用「doSearch()
」,然後拋棄該閉包。
因此,隨着用戶的類型,關閉被扔掉,不再重要。最終用戶將暫停或停止輸入,此時您要運行的代碼實際上會執行(在這種情況下,將根據文本執行搜索)。這爲您提供了一種感覺反應靈敏的搜索表單,但不會浪費時間爲用戶輸入的每個字符添加搜索(這會增加開銷並開始影響用戶界面性能)。
你的代碼令人困惑... – BlueBoy
@BlueBoy:增加了更多關於發生了什麼的解釋。我喜歡這種方法比基於定時器的方法多一點,因爲我不想使用定時器和自定義類來處理響應。 –
- 1. 開始寫入時運行命令,停止寫入後4秒鐘運行
- 2. 幾秒鐘後停止requestAnimationFrame
- 3. 代碼在錯誤後停止運行
- 4. 讓代碼運行X秒,之後停止
- 5. MPMoviePlayerViewController在幾秒鐘後停止
- 6. 在Android中每隔1秒鐘在後臺運行我的代碼
- 7. Uwamp Mysql Server從CD停止運行5秒鐘後
- 8. php代碼停止用戶中止後,它運行,直到腳本完成
- 9. Swift:音頻開始和停止.1秒
- 10. 多GPU代碼運行幾秒鐘只
- 11. 停止代碼X秒,然後繼續
- 12. C代碼停止運行
- 13. php代碼停止運行
- 14. 30秒後停止在線程中執行代碼
- 15. 如何處理用戶在文本框中鍵入html代碼
- 16. 文件處理:代碼停止運行
- 17. 停止運行extern鬧鐘
- 18. 如何在終止後運行swift代碼應用程序
- 19. 統一C#代碼適用於大約10秒鐘,然後停止
- 20. MPMoviePlayerController停止播放5秒後 - Swift
- 21. 5秒後停止Javascript函數/設置。5秒鐘後的Blur()
- 22. 1分鐘後停止setTimeout。循環
- 23. 工作客戶端開始後幾秒鐘停止
- 24. jquery運行代碼最後一次按鍵後2秒
- 25. 如何停止/延遲代碼幾秒鐘
- 26. 文本到語音轉語音停止在Android上通話後運行代碼
- 27. 用戶鍵入幾秒鐘後查詢搜索流星+反應
- 28. 停止在jquery上運行javascript代碼
- 29. Java程序在請求用戶輸入後停止運行
- 30. PHP停止警告1行代碼
我的回答對你有幫助嗎? –
@ReinierMelian它的工作原理,但我最終做了一些不同的事情,因爲我不想創建一個新的TextView。 – BlueBoy
好@BlueBoy好運!謝謝你讓我知道 –