Swift:调用无completion handler的endEditing后无延迟执行任务的方法
可用方案(均无需手动加延迟)
方案1:用CATransaction捕获动画完成回调
endEditing触发的键盘收起动画默认会被归到当前的CATransaction事务中,你可以手动包裹事务监听完成事件:
CATransaction.begin() CATransaction.setCompletionBlock { // 这里写你要执行的后续操作,会在键盘收起动画完全结束后触发 } self.view.endEditing(force: true) CATransaction.commit()
这个方案的优势是代码耦合度低,不需要额外监听全局通知。
方案2:监听键盘收起的系统通知
如果你的后续操作需要全局响应键盘收起事件,可以监听UIResponder.keyboardDidHideNotification通知:
// 先注册通知 NotificationCenter.default.addObserver( self, selector: #selector(keyboardDidFullyHide), name: UIResponder.keyboardDidHideNotification, object: nil ) @objc private func keyboardDidFullyHide() { // 这里写后续操作 } // 记得在合适的时机移除通知,比如deinit里 deinit { NotificationCenter.default.removeObserver(self) }
补充说明
如果你的后续操作不需要等键盘收起动画完成,只需要确认第一响应者已经退出编辑状态,那不需要额外处理:endEditing(force:)本身是同步执行的,调用后立刻就能判断返回值:
let editEnded = self.view.endEditing(force: true) if editEnded { // 已经成功触发退出编辑,不需要等动画的话这里直接执行后续操作即可 }
内容的提问来源于stack exchange,提问作者StackGU
相关产品推荐
相关产品推荐

