iOS13適配三指撤銷(xiāo)和文案限長(zhǎng)實(shí)例詳解
正文
在適配iOS13的過(guò)程中,UITextField
輸入中文的時(shí)候三指撤銷(xiāo)產(chǎn)生了 crash。
Bugly報(bào)錯(cuò)
NSInternalInconsistencyException setGroupIdentifier:: _NSUndoStack 0x1206532f0 is in invalid state, calling setGroupIdentifier with no begin group mark
堆棧信息
CoreFoundation ___exceptionPreprocess + 220 libobjc.A.dylib objc_exception_throw + 56 Foundation -[_NSUndoStack groupIdentifier] Foundation -[NSUndoManager undoNestedGroup] + 240 UIKitCore -[UIUndoGestureInteraction undo:] + 72 UIKitCore -[UIKBUndoInteractionHUD performDelegateUndoAndUpdateHUDIfNeeded] + 96 UIKitCore -[UIKBUndoInteractionHUD controlActionUpInside:] + 152 UIKitCore -[UIApplication sendAction:to:from:forEvent:] + 96 xxxxx -[UIApplication(MemoryLeak) swizzled_sendAction:to:from:forEvent:] + 288 UIKitCore -[UIControl sendAction:to:forEvent:] + 240 UIKitCore -[UIControl _sendActionsForEvents:withEvent:] + 408 UIKitCore -[UIControl touchesEnded:withEvent:] + 520 UIKitCore -[UIWindow _sendTouchesForEvent:] + 2324 UIKitCore -[UIWindow sendEvent:] + 3352 UIKitCore -[UIApplication sendEvent:] + 336 UIKitCore ___dispatchPreprocessedEventFromEventQueue + 5880 UIKitCore ___handleEventQueueInternal + 4924 UIKitCore ___handleHIDEventFetcherDrain + 108 CoreFoundation ___CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 CoreFoundation ___CFRunLoopDoSource0 + 80 CoreFoundation ___CFRunLoopDoSources0 + 180 CoreFoundation ___CFRunLoopRun + 1080 CoreFoundation CFRunLoopRunSpecific + 464 GraphicsServices GSEventRunModal + 104 UIKitCore UIApplicationMain + 1936 xxxxx main + 148 libdyld.dylib _start + 4
問(wèn)題定位
沒(méi)有太多思路的時(shí)候,通過(guò)注釋代碼,最終定位到了問(wèn)題所在。
[self addTarget:observer action:@selector(textChange:) forControlEvents:UIControlEventEditingChanged];
- (void)textChange:(UITextField *)textField { ... ... UITextRange *selectedRange = [textField markedTextRange]; if (!selectedRange || !selectedRange.start) { if (destText.length > maxLength) { textField.text = [destText substringToIndex:maxLength]; } } }
這段代碼在輸入的時(shí)候會(huì)限制文案的長(zhǎng)度。三指撤銷(xiāo)會(huì)觸發(fā)UIControlEventEditingChanged
事件,執(zhí)行textChange
,此時(shí)獲取到的markedTextRange
是nil
,即便是存在markedText
。這就導(dǎo)致UITextField
的text
有可能會(huì)被修改。修改文案后再繼續(xù)執(zhí)行撤銷(xiāo)操作,必定會(huì)產(chǎn)生 crash。
解決方案
將文案判長(zhǎng)和截取異步添加到主隊(duì)列,在下一個(gè)runloop
執(zhí)行。
- (void)textChange:(UITextField *)textField { dispatch_async(dispatch_get_main_queue(), ^{ ... ... }); }
數(shù)字截?cái)嗪?crash
數(shù)字輸入限制長(zhǎng)度后,超過(guò)長(zhǎng)度后繼續(xù)輸入,這個(gè)時(shí)候撤銷(xiāo)也會(huì)產(chǎn)生crash,而且上面的方法不可行。目前想到的方案是在UITextField
的回調(diào)方法進(jìn)行輸入的攔截。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { /// 輸入數(shù)字后截取字符串仍舊可以觸發(fā)撤銷(xiāo)操作導(dǎo)致crash, 在這里攔截一下 if (textField.keyboardType == UIKeyboardTypeNumberPad && range.location >= textField.tt_maxLength) { return NO; } return YES; }
以上就是iOS13適配三指撤銷(xiāo)和文案限長(zhǎng)實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于iOS13適配三指撤銷(xiāo)文案限長(zhǎng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Xcode為iOS應(yīng)用項(xiàng)目創(chuàng)建PCH文件的方法及應(yīng)用示例
這篇文章主要介紹了使用Xcode為iOS應(yīng)用項(xiàng)目創(chuàng)建PCH文件的方法及應(yīng)用示例,PCH文件可以保留應(yīng)用的很多的基礎(chǔ)設(shè)置信息以供復(fù)用,需要的朋友可以參考下2016-03-03iOS 報(bào)clang: error: no input files錯(cuò)誤的解決方法
這篇文章主要給大家介紹了關(guān)于iOS報(bào)clang: error: no input files錯(cuò)誤的解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01實(shí)例解析iOS app開(kāi)發(fā)中音頻文件播放工具類(lèi)的封裝
這篇文章主要介紹了iOS app開(kāi)發(fā)中音頻文件播放工具類(lèi)的封裝,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01淺述iOS11 Xcode 9 按住command 單擊 恢復(fù)到從前(直接跳轉(zhuǎn)到定義)
這篇文章主要介紹了 iOS11 Xcode 9 按住command 單擊 恢復(fù)到從前(直接跳轉(zhuǎn)到定義)的相關(guān)資料,需要的朋友可以參考下2017-10-10iOS 中KVC、KVO、NSNotification、delegate 總結(jié)及區(qū)別
這篇文章主要介紹了iOS 中KVC、KVO、NSNotification、delegate 總結(jié)及區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-10-10Objective-C實(shí)現(xiàn)自定義的半透明導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Objective-C實(shí)現(xiàn)自定義的半透明導(dǎo)航的相關(guān)資料,需要的朋友可以參考下2016-05-05僅幾行iOS代碼限制TextField輸入長(zhǎng)度
這篇文章主要為大家詳細(xì)介紹了通過(guò)幾行iOS代碼限制TextField輸入長(zhǎng)度的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09詳解IOS圖層轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了IOS圖層轉(zhuǎn)場(chǎng)動(dòng)畫(huà), CATransition類(lèi)實(shí)現(xiàn)層的轉(zhuǎn)場(chǎng)動(dòng)畫(huà),能夠?yàn)閷犹峁┮瞥銎聊缓鸵迫肫聊坏膭?dòng)畫(huà)效果,感興趣的小伙伴們可以參考一下2016-02-02