我们遇到以下问题,这就是我重现它的方法:
我在rootviewcontroller和viewDidLoad中有一个textfield:
UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
tf.backgroundColor = [UIColor whiteColor];
tf.delegate = self;
[self.view addSubview:tf];
[tf becomeFirstResponder];
RootViewController有2个容器,一个用于侧边菜单,另一个用于实际内容视图。它委托UITextFieldDelegate和UITextViewDelegate
在浏览了几个这样的视图控制器之后:
[destination.view setFrame:[[UIScreen mainScreen] applicationFrame]];
[self.currentVC willMoveToParentViewController:nil];
[self addChildViewController:destination];
[self transitionFromViewController:self.currentVC
toViewController:destination
duration:0.25
options:UIViewAnimationOptionTransitionCrossDissolve
animations:nil
completion:^(BOOL finished){
[self.currentVC removeFromParentViewController];
[destination didMoveToParentViewController:self];
self.currentVC = destination;
self.currentSelection = selection;
}];
每当我想使用“Cmd + K”(模拟器)显示键盘时,我得到一个EXC_BAD_ACCESS
再次发生崩溃的唯一方法是显示系统键盘
我没有想法!这是跟踪:
0 0x00c1d160 in CALayerGetSuperlayer ()
1 0x00fae832 in -[UIView(Hierarchy) superview] ()
2 0x00fa144a in -[UIView nextResponder] ()
3 0x010f39f1 in -[UIResponder(Internal) _responderWindow] ()
4 0x00fbbc89 in -[UIView(Internal) _firstResponder] ()
5 0x010f25c2 in -[UIResponder isFirstResponder] ()
6 0x01748243 in -[UITextView _keyboardDidShow:] ()
7 0x0222d079 in __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke ()
8 0x02dd8be4 in __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ ()
9 0x02cc511b in _CFXNotificationPost ()
10 0x0221c5d6 in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
11 0x016fe4e5 in -[UIInputWindowController postEndNotifications:withInfo:] ()
12 0x01705660 in -[UIInputWindowController keyboardHeightChangeDone] ()
13 0x0117da40 in -[UIKeyboardImpl _resizeForKeyplaneSize:splitWidthsChanged:] ()
14 0x012ebf42 in __66-[UIKeyboardPredictionView setPredictionViewState:animate:notify:]_block_invoke ()
15 0x00fb7c06 in +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] ()
16 0x00fb7fc7 in +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:] ()
17 0x012ebd31 in -[UIKeyboardPredictionView setPredictionViewState:animate:notify:] ()
18 0x012eb78a in -[UIKeyboardPredictionView setPredictionViewState:animate:] ()
19 0x01193b1a in -[UIKeyboardImpl showKeyboard] ()
20 0x01195fb0 in -[UIKeyboardImpl toggleSoftwareKeyboard] ()
21 0x01196020 in -[UIKeyboardImpl ejectKeyDown] ()
22 0x00f32920 in -[UIApplication _physicalButtonsBegan:withEvent:] ()
23 0x0269a7cd in -[NSObject performSelector:withObject:withObject:] ()
24 0x010f1c94 in forwardTouchMethod ()
25 0x010f4226 in -[UIResponder(Internal) _physicalButtonsBegan:withEvent:] ()
26 0x0269a7cd in -[NSObject performSelector:withObject:withObject:] ()
27 0x010f1c94 in forwardTouchMethod ()
28 0x010f4226 in -[UIResponder(Internal) _physicalButtonsBegan:withEvent:] ()
29 0x0269a7cd in -[NSObject performSelector:withObject:withObject:] ()
30 0x010f1c94 in forwardTouchMethod ()
31 0x010f4226 in -[UIResponder(Internal) _physicalButtonsBegan:withEvent:] ()
32 0x0269a7cd in -[NSObject performSelector:withObject:withObject:] ()
33 0x010f1c94 in forwardTouchMethod ()
34 0x010f4226 in -[UIResponder(Internal) _physicalButtonsBegan:withEvent:] ()
35 0x0176f4d3 in -[UITextField _physicalButtonsBegan:withEvent:] ()
36 0x00f8732a in -[UIWindow _sendButtonsForEvent:] ()
37 0x00f878d8 in -[UIWindow sendEvent:] ()
38 0x00f45681 in -[UIApplication sendEvent:] ()
39 0x00f55ab8 in _UIApplicationHandleEventFromQueueEvent ()
40 0x00f292e7 in _UIApplicationHandleEventQueue ()
41 0x02d3006f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
42 0x02d25b7d in __CFRunLoopDoSources0 ()
43 0x02d250d8 in __CFRunLoopRun ()
44 0x02d24a5b in CFRunLoopRunSpecific ()
45 0x02d2488b in CFRunLoopRunInMode ()
46 0x058352c9 in GSEventRunModal ()
47 0x05835106 in GSEventRun ()
48 0x00f2d0b6 in UIApplicationMain ()
49 0x001cd8ba in main at main.m:14
50 0x03b4cac9 in start ()
更新:我联系了苹果支持以获得帮助,因为我必须解决这个问题。我的想法是我们正在做一些糟糕的内存管理但是Profiler没有显示Zombies。我们在ADBEncondingStringToHex中有一个内存泄漏,但无法对该信息执行任何操作。也许完全不相关,也许不是......
答案 0 :(得分:0)
我认为在[tf becomeFirstResponder]
中调用viewDidLoad
太早了 - 在视图是应用程序视图层次结构的一部分之前。您应该在viewWillAppear:
或viewDidAppear:
中调用它。
来自文档:
您可以调用此方法来创建响应者对象,例如查看第一响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图的window属性包含UIWindow对象,则它已安装在视图层次结构中;如果它返回nil,则视图将从任何层次结构中分离。
答案 1 :(得分:0)
此问题在iOS8.xx之前发生在我身上(虽然iOS7.xx没问题)。我通过在键盘弹出之前调用 becomeFirstResponder 的textField的 resignFirstResponder 解决了这个问题。因此,我认为您应该在显示键盘的任何内容之前,将以下代码调用 tf textField的 resignFirstResponder :
[tf resignFirstResponder];