iOS9 关闭时键盘崩溃
iOS9 keyboard crash on dismiss
我的这个登录屏幕在 iOS9 之前运行良好。键盘有一个 Next 按钮,用于从用户名字段转到密码字段,还有一个 Done 按钮,用于关闭键盘。但是,在 iOS 9 它崩溃了。我在 8.4 上测试过它并且它有效。在 iOS 9.0 和 9.1 上它崩溃了。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField == usernameField) {
[passwordField becomeFirstResponder];
} else if (textField == passwordField) {
[textField resignFirstResponder];
}
return NO;
}
我正确设置了委托。
所以基本上,当我按 'Next' 或 'Done'
崩溃:
CoreFoundation`__CFTypeCollectionRetain:
0x2239dd5c <+0>: push {r4, r5, r7, lr}
0x2239dd5e <+2>: add r7, sp, #0x8
0x2239dd60 <+4>: mov r4, r1
0x2239dd62 <+6>: cbz r4, 0x2239ddc4 ; <+104>
0x2239dd64 <+8>: ldrd r0, r1, [r4]
0x2239dd68 <+12>: cmp r0, #0x0
0x2239dd6a <+14>: ubfx r1, r1, #0x8, #0xa
0x2239dd6e <+18>: beq 0x2239dda2 ; <+70>
0x2239dd70 <+20>: movw r2, #0x7254
0x2239dd74 <+24>: movt r2, #0x14d1
0x2239dd78 <+28>: add r2, pc
0x2239dd7a <+30>: ldr r2, [r2]
0x2239dd7c <+32>: cmp r0, r2
0x2239dd7e <+34>: beq 0x2239dda2 ; <+70>
0x2239dd80 <+36>: movw r2, #0x6240
0x2239dd84 <+40>: movt r2, #0x14d1
0x2239dd88 <+44>: add r2, pc
0x2239dd8a <+46>: ldr.w r5, [r2, r1, lsl #2]
0x2239dd8e <+50>: cmp r0, r5
0x2239dd90 <+52>: beq 0x2239dda2 ; <+70>
0x2239dd92 <+54>: tst.w r0, #0x1
0x2239dd96 <+58>: beq 0x2239ddae ; <+82>
0x2239dd98 <+60>: mov r0, r4
0x2239dd9a <+62>: blx 0x2243208c ; symbol stub for: -[__NSFileSecurity getGroup:]
0x2239dd9e <+66>: cmp r0, r5
0x2239dda0 <+68>: bne 0x2239ddae ; <+82>
0x2239dda2 <+70>: mov r0, r4
0x2239dda4 <+72>: movs r1, #0x0
0x2239dda6 <+74>: pop.w {r4, r5, r7, lr}
0x2239ddaa <+78>: b.w 0x222e6ce8 ; _CFRetain
0x2239ddae <+82>: movw r0, #0x3256
0x2239ddb2 <+86>: movt r0, #0x13fb
0x2239ddb6 <+90>: add r0, pc
0x2239ddb8 <+92>: ldr r1, [r0]
0x2239ddba <+94>: mov r0, r4
0x2239ddbc <+96>: pop.w {r4, r5, r7, lr}
0x2239ddc0 <+100>: b.w 0x22430e10 ; objc_msgSend$shim
0x2239ddc4 <+104>: movw r0, #0x332e
0x2239ddc8 <+108>: movs r3, #0x0
0x2239ddca <+110>: movt r0, #0x1223
0x2239ddce <+114>: movw r2, #0x116d
0x2239ddd2 <+118>: add r0, pc
0x2239ddd4 <+120>: movt r2, #0xc
0x2239ddd8 <+124>: ldr r0, [r0]
0x2239ddda <+126>: add r2, pc
0x2239dddc <+128>: strd r2, r3, [r0, #8]
-> 0x2239dde0 <+132>: trap
0x2239dde2 <+134>: nop
崩溃发生在'->'行
我看到了这个 post,但没有帮助:
iOS9 dismissing keyboard causes crash
我真的需要一些帮助来解决这个问题。
提前致谢!
编辑:
我发现,这与我的 UIFont 类别有关,该类别使用我的自定义字体提供所有视图。
我觉得....
问题出在 UIViewController 类别
dealloc 方法被覆盖以清理通知回调。
它导致 iOS9 崩溃。可能是因为 [super dealloc] 没有被调用(由于 ARC 限制)
解决方案 - 从类别中删除 dealloc 方法到 UIViewController 子类.....
先设置textfield标签然后放这段代码
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
NSInteger nextTag = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder) {
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
} else {
// Not found, so remove keyboard.
[textField resignFirstResponder];
}
return NO;
}
太好了,解决方案似乎与键盘几乎无关。我有一个 CustomFont,我通过创建 UIFont 类别来设置它。在那个类别中,我换掉了一些方法来为所有 UI 元素提供 customFont。不知何故,应用程序 运行 在 textField 完成编辑之前一直很好,然后我可能换掉了 iOS 9 更新后不存在的方法。通过注释掉那条线,一切都恢复正常了。谢谢大家
我的这个登录屏幕在 iOS9 之前运行良好。键盘有一个 Next 按钮,用于从用户名字段转到密码字段,还有一个 Done 按钮,用于关闭键盘。但是,在 iOS 9 它崩溃了。我在 8.4 上测试过它并且它有效。在 iOS 9.0 和 9.1 上它崩溃了。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField == usernameField) {
[passwordField becomeFirstResponder];
} else if (textField == passwordField) {
[textField resignFirstResponder];
}
return NO;
}
我正确设置了委托。
所以基本上,当我按 'Next' 或 'Done' 崩溃:
CoreFoundation`__CFTypeCollectionRetain:
0x2239dd5c <+0>: push {r4, r5, r7, lr}
0x2239dd5e <+2>: add r7, sp, #0x8
0x2239dd60 <+4>: mov r4, r1
0x2239dd62 <+6>: cbz r4, 0x2239ddc4 ; <+104>
0x2239dd64 <+8>: ldrd r0, r1, [r4]
0x2239dd68 <+12>: cmp r0, #0x0
0x2239dd6a <+14>: ubfx r1, r1, #0x8, #0xa
0x2239dd6e <+18>: beq 0x2239dda2 ; <+70>
0x2239dd70 <+20>: movw r2, #0x7254
0x2239dd74 <+24>: movt r2, #0x14d1
0x2239dd78 <+28>: add r2, pc
0x2239dd7a <+30>: ldr r2, [r2]
0x2239dd7c <+32>: cmp r0, r2
0x2239dd7e <+34>: beq 0x2239dda2 ; <+70>
0x2239dd80 <+36>: movw r2, #0x6240
0x2239dd84 <+40>: movt r2, #0x14d1
0x2239dd88 <+44>: add r2, pc
0x2239dd8a <+46>: ldr.w r5, [r2, r1, lsl #2]
0x2239dd8e <+50>: cmp r0, r5
0x2239dd90 <+52>: beq 0x2239dda2 ; <+70>
0x2239dd92 <+54>: tst.w r0, #0x1
0x2239dd96 <+58>: beq 0x2239ddae ; <+82>
0x2239dd98 <+60>: mov r0, r4
0x2239dd9a <+62>: blx 0x2243208c ; symbol stub for: -[__NSFileSecurity getGroup:]
0x2239dd9e <+66>: cmp r0, r5
0x2239dda0 <+68>: bne 0x2239ddae ; <+82>
0x2239dda2 <+70>: mov r0, r4
0x2239dda4 <+72>: movs r1, #0x0
0x2239dda6 <+74>: pop.w {r4, r5, r7, lr}
0x2239ddaa <+78>: b.w 0x222e6ce8 ; _CFRetain
0x2239ddae <+82>: movw r0, #0x3256
0x2239ddb2 <+86>: movt r0, #0x13fb
0x2239ddb6 <+90>: add r0, pc
0x2239ddb8 <+92>: ldr r1, [r0]
0x2239ddba <+94>: mov r0, r4
0x2239ddbc <+96>: pop.w {r4, r5, r7, lr}
0x2239ddc0 <+100>: b.w 0x22430e10 ; objc_msgSend$shim
0x2239ddc4 <+104>: movw r0, #0x332e
0x2239ddc8 <+108>: movs r3, #0x0
0x2239ddca <+110>: movt r0, #0x1223
0x2239ddce <+114>: movw r2, #0x116d
0x2239ddd2 <+118>: add r0, pc
0x2239ddd4 <+120>: movt r2, #0xc
0x2239ddd8 <+124>: ldr r0, [r0]
0x2239ddda <+126>: add r2, pc
0x2239dddc <+128>: strd r2, r3, [r0, #8]
-> 0x2239dde0 <+132>: trap
0x2239dde2 <+134>: nop
崩溃发生在'->'行
我看到了这个 post,但没有帮助: iOS9 dismissing keyboard causes crash
我真的需要一些帮助来解决这个问题。
提前致谢!
编辑: 我发现,这与我的 UIFont 类别有关,该类别使用我的自定义字体提供所有视图。
我觉得....
问题出在 UIViewController 类别
dealloc 方法被覆盖以清理通知回调。
它导致 iOS9 崩溃。可能是因为 [super dealloc] 没有被调用(由于 ARC 限制)
解决方案 - 从类别中删除 dealloc 方法到 UIViewController 子类.....
先设置textfield标签然后放这段代码
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
NSInteger nextTag = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder) {
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
} else {
// Not found, so remove keyboard.
[textField resignFirstResponder];
}
return NO;
}
太好了,解决方案似乎与键盘几乎无关。我有一个 CustomFont,我通过创建 UIFont 类别来设置它。在那个类别中,我换掉了一些方法来为所有 UI 元素提供 customFont。不知何故,应用程序 运行 在 textField 完成编辑之前一直很好,然后我可能换掉了 iOS 9 更新后不存在的方法。通过注释掉那条线,一切都恢复正常了。谢谢大家