2015-08-27 3 views
2

Мы имеем следующую проблему и это, как я его воспроизвести:IOS App сбой при отображении клавиатуры

  1. У меня есть текстовое поле в RootViewController и в viewDidLoad я:

    UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
    tf.backgroundColor = [UIColor whiteColor]; 
    tf.delegate = self; 
    [self.view addSubview:tf]; 
    [tf becomeFirstResponder]; 
    
  2. RootViewController имеет 2 контейнера, один для бокового меню и один для фактического содержимого. это ДЕЙСТВИТЕЛЬНО делегировать UITextFieldDelegate и UITextViewDelegate

  3. Если запустить приложение текстовое поле ведет себя правильно
  4. После перехода через несколько контроллеров зрения, как это:

    [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» (Simulator) Я получаю EXC_BAD_ACCESS

Опять единственный способ получить сбой - отобразить систему Клавиатура

  1. Включение Zombies делает его немного лучше, но он заканчивается сбоем (ТОЛЬКО, если я открываю клавиатуру).
  2. Я попытался таНос Guard но VM работает из памяти, и это не помогает

Я из идей! Вот след:

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

Есть ли у вас проблемы на реальном устройстве IOS? – rmaddy

+0

Да, проблема возникает на симуляторе и на реальном устройстве (iPad Mini и iPad с 8.4 также). В обеих версиях Debug и Release. – escarti

+0

Выстрел в темноте здесь, но я заметил вас [tf статьFirstResponder]; Вы когда-нибудь отменилиFirstResponder, прежде чем пытаться снова показать клавиатуру? – joels

ответ

0

Я думаю, что вызов [tf becomeFirstResponder] в viewDidLoad еще слишком рано - до того, как представление является частью иерархии представлений приложения. Вы должны называть его viewWillAppear: или viewDidAppear:.

Из документов:

Вы можете вызвать этот метод, чтобы сделать объект ответчика, такие как взгляд, первый ответчик. Однако вы должны вызывать его только на этом представлении, если оно является частью иерархии представлений. Если свойство окна вида содержит объект UIWindow, он был установлен в иерархии представлений; если он возвращает ноль, представление отделяется от любой иерархии.

+0

Перемещение текстового поля к различным методам и добавление его в качестве подсмотра различных представлений в иерархии было одной из первых вещей, которые я пробовал. Это происходит независимо от того, где и когда вы добавите его. Но я должен переходить между viewControllers. – escarti

0

Этот вопрос возник со мной раньше в iOS8.xx (без проблем с iOS7.xx). Я разрешил это, позвонив resignFirstResponder текстаField, который сталFirstResponder перед клавиатурой выскочить. Так что я думаю, вы должны позвонить ниже кода resignFirstResponder вашего тф TextField, прежде всего, что вывести клавиатуру:

[tf resignFirstResponder]; 
+0

Я дам ему попробовать, но вызов startFirstResponder был всего лишь способом избавить меня от необходимости щелкнуть по текстовому полю, чтобы воспроизвести ошибку. В любом случае, это даст ему попробовать завтра. – escarti

+0

@escarti Решает ли ваша проблема ваша проблема? Пожалуйста, уточните, поэтому мне, возможно, придет еще одно решение. – SanitLee

+0

Хорошо, поэтому добавление строки [tf resignFirstResponer] устанавливает отсутствующее соединение между сбоем и моим приложением. Похоже, что причиной сбоя является «resignFirstResponder». К сожалению, это не устраняет проблему. – escarti

Смежные вопросы