2015-04-10 3 views
16

У меня есть приложение для iPad. Я создаю UIAlertController и добавляю текстовое поле. Он падает. Он только падает, когда я добавляю текстовое поле.iOS 8.3 UIAlertController падает при попытке добавить текстовое поле

let alert = UIAlertController(title: "Enter Name", message:nil, preferredStyle: UIAlertControllerStyle.Alert);   
alert.addTextFieldWithConfigurationHandler { (textfield:UITextField!) -> Void in 
       textfield.placeholder = "Sexy time"; 

      } 
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: {(action:UIAlertAction!) -> Void in 
     //Some action here 
})); 

self.presentViewController(alert, animated: true, completion: nil); 

Я получаю забавный крах, говорящий мне, что ограничения перепутаны. Этот код отлично работает в < 8.3 без предупреждений. Даже в чистом проекте, в котором нет ничего, кроме этого кода, он падает. Проект должен быть проектом splitview на iPad.

Вот полная трассировка стека плюс причудливые предупреждения ограничения, которые появляются только после попытки добавить текстовое поле к alertController.

2015-04-10 15:25:07.155 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66cf9dfc0 UITableView:0x7fb66b855000.left == UIView:0x7fb66fae68e0.left> 
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug. 
2015-04-10 15:25:07.155 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66cf9e010 UITableView:0x7fb66b855000.right == UIView:0x7fb66fae68e0.right> 
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug. 
2015-04-10 15:25:07.155 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66fb37f90 UITableView:0x7fb66b855000.top == UIView:0x7fb66fae68e0.top> 
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug. 
2015-04-10 15:25:07.156 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66fb80580 UITableView:0x7fb66b855000.bottom == UIView:0x7fb66fae68e0.bottom> 
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug. 
2015-04-10 15:25:13.589 Observation[18235:281813] View hierarchy unprepared for constraint. 
    Constraint: <NSLayoutConstraint:0x7fb66cf9dfc0 UITableView:0x7fb66b855000.left == UIView:0x7fb66fae68e0.left> 
    Container hierarchy: 
<UIView: 0x7fb66fa86e00; frame = (0 0; 0 0); layer = <CALayer: 0x7fb66fadf8e0>> 
    | <UIView: 0x7fb66af3e080; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x7fb66fae32c0>> 
    | | <_UIAlertControllerShadowedScrollView: 0x7fb66fa68c80; frame = (0 0; 0 0); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x7fb66fa38a80>; layer = <CALayer: 0x7fb66fa97560>; contentOffset: {0, 0}; contentSize: {0, 0}> 
    | | | <UIView: 0x7fb66fa87350; frame = (0 0; 0 0); layer = <CALayer: 0x7fb66fadf810>> 
    | | | | <UILabel: 0x7fb66fa88740; frame = (0 0; 0 0); text = 'Enter Name'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb66fa94ed0>> 
    | | | | <UILabel: 0x7fb66fa73710; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb66cc0ee10>> 
    | | | | <UIView: 0x7fb66fae68e0; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x7fb66fa90160>> 
    | | <UILabel: 0x7fb66fa3ad40; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb66fa73680>> 
    | | <UICollectionView: 0x7fb66c130200; frame = (0 0; 0 0); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x7fb66faebab0>; layer = <CALayer: 0x7fb66fa3acf0>; contentOffset: {0, 0}; contentSize: {0, 0}> collection view layout: <_UIAlertControllerCollectionViewFlowLayout: 0x7fb66fae0b30> 
    View not found in container hierarchy: <UITableView: 0x7fb66b855000; frame = (0 20; 768 1004); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7fb66cf79f30>; layer = <CALayer: 0x7fb66cf600a0>; contentOffset: {0, 0}; contentSize: {768, 25}> 
    That view's superview: NO SUPERVIEW 
2015-04-10 15:25:13.594 Observation[18235:281813] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal. constraint:<NSLayoutConstraint:0x7fb66cf9dfc0 UITableView:0x7fb66b855000.left == UIView:0x7fb66fae68e0.left> view:<UIView: 0x7fb66fa86e00; frame = (0 0; 0 0); layer = <CALayer: 0x7fb66fadf8e0>>' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000102940c65 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000010221dbb7 objc_exception_throw + 45 
    2 CoreFoundation      0x0000000102940b9d +[NSException raise:format:] + 205 
    3 Foundation       0x0000000101daf479 -[NSLayoutConstraint _addToEngine:integralizationAdjustment:mutuallyExclusiveConstraints:] + 187 
    4 UIKit        0x00000001039bca34 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 474 
    5 Foundation       0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155 
    6 UIKit        0x00000001039bc83a __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 452 
    7 UIKit        0x00000001039bc64d -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 197 
    8 UIKit        0x00000001039bc933 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 217 
    9 Foundation       0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155 
    10 UIKit        0x00000001039bc83a __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 452 
    11 UIKit        0x00000001039bc64d -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 197 
    12 UIKit        0x00000001039bc933 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 217 
    13 Foundation       0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155 
    14 UIKit        0x00000001039bc83a __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 452 
    15 UIKit        0x00000001039bc64d -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 197 
    16 UIKit        0x00000001033b5717 __40-[UIView(Hierarchy) layoutBelowIfNeeded]_block_invoke + 39 
    17 Foundation       0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155 
    18 UIKit        0x00000001033b5556 -[UIView(Hierarchy) layoutBelowIfNeeded] + 320 
    19 UIKit        0x000000010374a394 -[_UIAlertControllerAnimatedTransitioning animateTransition:] + 470 
    20 UIKit        0x000000010344fa4e __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 1867 
    21 UIKit        0x000000010336562c _applyBlockToCFArrayCopiedToStack + 314 
    22 UIKit        0x00000001033654a6 _afterCACommitHandler + 533 
    23 CoreFoundation      0x0000000102873ca7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 
    24 CoreFoundation      0x0000000102873c00 __CFRunLoopDoObservers + 368 
    25 CoreFoundation      0x0000000102869a33 __CFRunLoopRun + 1123 
    26 CoreFoundation      0x0000000102869366 CFRunLoopRunSpecific + 470 
    27 GraphicsServices     0x0000000106dd6a3e GSEventRunModal + 161 
    28 UIKit        0x0000000103341900 UIApplicationMain + 1282 
    29 Observation       0x0000000101612927 main + 135 
    30 libdyld.dylib      0x0000000104f60145 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

Просто FYI проект является splitview работает на iPad. – MweyaMutsvene

+0

У меня такая же ошибка. В моем случае uialertcontroller запускается с помощью кнопки в заголовке раздела uitableview. – Seb

ответ

13

Edit: Это исправление изменяется в зависимости от того, если вы строите с Xcode 6 или 7 Xcode, поэтому я добавил соответствующую информацию для обеих версий Xcode.


Я столкнулся с этим сегодня и то, что он говорит, что он не может добавить текстовое поле зрения контроллера представления, или что он не может добавить ограничения автоматической компоновки для его надтаблицы. Кажется, это связано с тем, что он еще не создал супервизор, чтобы добавить его еще, и так все паники и сбои.

Простое исправление, которое я нашел, добавляет текстовое поле после того, как вы сообщите диспетчеру оповещения.Это исправило это для меня, хотя я не уверен, повлияет ли это на что-нибудь вроде текстового поля, появляющегося при представлении предупреждения.

Построенный с Xcode 6

let alertController = UIAlertController(title: "Enter Name", message:nil, preferredStyle: .Alert) 

let okAction = UIAlertAction(title: "Ok", style: .Default) { (_) -> Void in 
    // Some action here 
} 
alertController.addAction(okAction) 

presentViewController(alertController, animated: true, completion: nil) 

// Add any text fields after presenting the alert controller to fix crash in iOS 8.3 
alertController.addTextFieldWithConfigurationHandler { (textfield) -> Void in 
    textfield.placeholder = "Name" 
} 

P.S. В качестве побочной заметки из вашего примера кода, помните с помощью Swift, вам не нужно использовать ; в конце каждой строки, хотя это не имеет значения, если вы это сделаете.


Построенный с Xcode 7

Когда вы строите ваше приложение с помощью Xcode 7, похоже, Apple, исправили проблему. Использование метода, показанного выше, больше не будет отображать текстовое поле в iOS 9 (хотя оно все еще верно отображается в iOS 8).

Ниже приведен фрагмент кода, как это должно было быть все время, и когда построено в Xcode 7 он правильно работает в прошивке 8 и прошивке 9.

let alertController = UIAlertController(title: "Enter Name", message:nil, preferredStyle: .Alert) 

alertController.addTextFieldWithConfigurationHandler { (textfield) -> Void in 
    textfield.placeholder = "Name" 
} 

let okAction = UIAlertAction(title: "Ok", style: .Default) { (_) -> Void in 
    // Some action here 
} 
alertController.addAction(okAction) 

presentViewController(alertController, animated: true, completion: nil) 

Испытан в Swift 2.0 и obj- C с Xcode 7 GM (7A218)

+0

Удивительный, спасибо, отлично работал. И да, я знаю, что мне не нужно использовать «;», он просто чувствует себя неполным, если я не хочу :) – MweyaMutsvene

+1

Это обходное решение устраняет крах на iOS 8.3 и 8.4. Однако учтите, что с iOS 9 beta 1 до 3 это приводит к появлению контроллера предупреждения ** без ** текстового поля. Таким образом, это обходное решение должно применяться только для iOS 8.x. – junjie

+0

Я могу подтвердить, что в текущей версии iOS 9 Beta, встроенной в Xcode 7 Beta 3, это исправление не работает. Как отмечает @junjie, он просто не добавляет текстовое поле. Я обновлю ответ, когда выпущены версии GM Xcode 7 и iOS 9. – Baza207

0

Попробуйте установить alert.view.frame явно в нечто маленькое. Я думаю, что по умолчанию он может быть таким же большим, как вид приложения, вызывая его на своих подзаголовках.

+0

Извините, не работал – MweyaMutsvene

1

Я только что запустил ваш код внутри моего тестового проекта - все отлично работало на 8.3.

View not found in container hierarchy:

Эта ошибка обычно возникает, если вы запутались UIViewController ребенок/родительские отношения. Есть несколько моментов, которые необходимо учитывать:

  • контроллер используется для представления предупреждения является верхним и ничего другим уже
  • родительских контроллеров либо не представляя есть тот, который вы используете, как ребенок (addChildViewController:) или в состояние представления его либо через presentViewController:animated:completion: или любит его просмотра
  • контроллера загружается перед представлением другого ViewController

Кроме того, есть определенно что-то не так с кадрами.

+0

Я забыл упомянуть, что проект должен быть сплитконтроллером на ipad. Случается, когда я добавляю код в метод ViewDidAppear в файле DetailViewController по умолчанию, который создает xcode для вас. – MweyaMutsvene

2

В сообщениях, связанных с iOS 8.3, есть ошибка. Он проявляется как в (устаревшем) UIAlertView, так и в UIAlertController только для iOS8. При попытке добавить текстовое поле в любой из этих контроллеров, я получаю следующее сообщение аварии:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'The layout constraints still need update after sending -updateConstraints to <_UIKeyboardLayoutAlignmentView: 0x792d28e0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x792d2ab0>>. 
_UIKeyboardLayoutAlignmentView or one of its superclasses may have overridden -updateConstraints without calling super. Or, something may have dirtied layout constraints in the middle of updating them. Both are programming errors.' 

Alerts без TextFields правильны, но показывающий UIAlertView со стилем UIAlertViewStylePlainTextInput или показывая UIAlertController с текстовым полем добавленным с помощью addTextFieldWithConfigurationHandler приведет к вышеуказанному сбою.

Исправление похоже на установку профилактического кадра на UIAlertController перед вызовом show. Этот кадр переопределяется перед показом, но предотвращает крах.

if (NSClassFromString(@"UIAlertController")) { 
    // iOS8 
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert" 
                    message:@"Be alert, not alarmed" 
                  preferredStyle:UIAlertControllerStyleAlert]; 
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { 
     textField.keyboardType = UIKeyboardTypeEmailAddress; 

    }]; 
    alert.view.frame = CGRectMake(0.0, 0.0, 320.0, 400.0); // Workaround iOS8.3 bug - set this to larger than you'll need 

    [self presentViewController:alert animated:YES completion:^{ 
     [alert.textFields[0] becomeFirstResponder]; 
    }]; 
} else { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" 
                message:@"Be alert, not alarmed" 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
    UITextField *emailField = [alert textFieldAtIndex:0]; 
    emailField.keyboardType = UIKeyboardTypeEmailAddress; 

    [alert show]; 
} 
+0

Это не сделало это для меня. Все еще получаю ту же ошибку .... – Seb

+0

Я очень надеялся, что это сработает для меня, но, к сожалению, это не было – MweyaMutsvene

+0

Пожалуйста, см. Мой ответ ниже, у меня был такой же крах и исправлено. – Chris

0

У меня такая же проблема с новыми iOS 8.3 и Swift 1.2. UIAlertController в UIViewController с вложенным UITableView не работает, как в стартовой теме.

Итак, я создал настоящую модальную форму.

  1. Создать новую ширину UIViewController, установить фоном просмотра на черный с 0.4 непрозрачности
  2. Добавить 300x150 UIView с двумя кнопками, этикетки и UITextField
  3. Добавить ограничения и другие необходимые сотрудники You must see something like this
  4. Connect модально другие контроллеры с новым enter image description here
  5. и указать специальный класс для нового контроллер как «PopupWindow». Затем создайте этот класс:

    import UIKit 
    
    class PopupWindow: UIViewController, UITextFieldDelegate { 
    
        @IBOutlet var wrapper: UIView! 
        @IBOutlet var btnCancel: UIButton! 
        @IBOutlet var btnSave: UIButton! 
        @IBOutlet var textField: UITextField! 
        @IBOutlet var labelField: UILabel! 
    
        var keyboardHeight: CGFloat = 0 
        var data = [:] 
        var closure: ((textField: UITextField!) -> Void)? 
        var tmpText = "" 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
    
         self.labelField.text = self.data["title"] as? String 
         self.textField.text = self.data["text"] as? String 
    
         self.btnCancel.setTitle("cancel", forState: UIControlState.Normal) 
         var tmp = self.data["save"] != nil 
          ? self.data["save"] as! String 
          : "save" 
         self.btnSave.setTitle(tmp, forState: UIControlState.Normal) 
         self.btnSave.enabled = false 
    
         self.wrapper.layer.cornerRadius = 5.0 as CGFloat 
         self.textField.becomeFirstResponder() 
        } 
    
        @IBAction func onBtnCancel() { 
         self.dismissViewControllerAnimated(true, completion: nil) 
        } 
    
        @IBAction func onBtnSave() { 
         if self.closure != nil { 
          self.dismissViewControllerAnimated(true, completion: { 
           _ in 
           self.closure!(textField: self.textField) 
          }) 
         } 
    
        } 
    
        override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { 
         self.fixTopOffset() 
        } 
    
        override func viewWillAppear(animated: Bool) { 
         super.viewWillAppear(animated) 
    
         NSNotificationCenter.defaultCenter().addObserver(self, selector: "textFieldDidChange:", name: UITextFieldTextDidChangeNotification, object: self.textField) 
    
         NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboadWillShow:", name: UIKeyboardWillShowNotification, object: nil) 
         NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboadWillShow:", name: UIKeyboardWillChangeFrameNotification, object: nil) 
         NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) 
        } 
    
        override func viewWillDisappear(animated: Bool) { 
         super.viewWillDisappear(animated) 
    
         NSNotificationCenter.defaultCenter().removeObserver(self, name: UITextFieldTextDidChangeNotification, object: nil) 
    
         NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
         NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillChangeFrameNotification, object: nil) 
         NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
        } 
    
        func onKeyboadWillShow(notification: NSNotification) { 
         self.fixTopOffset() 
         let info: NSDictionary = notification.userInfo! 
         if let rectValue = info[UIKeyboardFrameBeginUserInfoKey] as? NSValue { 
          let kbSize: CGRect = rectValue.CGRectValue() 
          if self.keyboardHeight != kbSize.size.height { 
           self.keyboardHeight = kbSize.size.height 
           self.fixTopOffset() 
          } 
         } 
        } 
    
        func onKeyboardWillHide(notification: NSNotification) { 
         self.fixTopOffset() 
         if self.keyboardHeight != 0 { 
          self.keyboardHeight = 0 
          self.fixTopOffset() 
         } 
        } 
    
        func fixTopOffset(landscape: Bool = true) { 
         let height1: CGFloat = self.view.frame.height/2 
         let height2: CGFloat = height1 - self.keyboardHeight/2 
         let margin: CGFloat = height1 - height2 
         for tmp in self.view.constraints() { 
          if let constraint = tmp as? NSLayoutConstraint { 
           if constraint.firstAttribute == NSLayoutAttribute.CenterY { 
            if constraint.constant != margin { 
             constraint.constant = margin 
            } 
           } 
          } 
    
         } 
        } 
    
        func textFieldDidChange(notification: NSNotification) { 
         if notification.object != nil { 
          if let textField = notification.object as? UITextField { 
           self.btnSave.enabled = textField.text != self.tmpText 
          } 
         } 
        } 
    
    } 
    

Вам нужно соединить все IBOutlets с соответствующими элементами в поле зрения с помощью Ctrl + Drag.

  1. И теперь вы можете использовать его в любом подключенном контроллере. Например:

    import UIKit 
    
    class ExampleView: UIViewController { 
    
        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {  
         if segue.identifier == "showPopup" { 
          if let controller = segue.destinationViewController as? PopupWindow { 
           controller.data = sender as! NSDictionary 
           // This action will be called after form submission 
           // We just print text in console 
           controller.closure = { 
            (textField: UITextField!) in 
            println(textField) 
           } 
          } 
         } 
        } 
    
        func showPopupWindow() { 
         let data = [ 
           "title": "My Window", 
           "save": "Save", 
           "text": "Do you realy want to save this text?", 
         ] 
         self.performSegueWithIdentifier("showPopup", sender: data) 
        } 
    } 
    

Теперь я могу просто добавить SEGUE к контроллеру и написать любое замыкание в методе prepareSegue - и это работает!

Я сделал короткое видео с всплывающим окном в моем приложении - http://youtu.be/JmqAAeUN-XU

+0

Воспроизведение UIAlertController кажется очень длинным способом исправления проблемы, подобной этой. Как правило, отдых должен быть последним, и если вы хотите добавить функциональность, то следует использовать подклассы или расширения. – Baza207

0

Аха, я думаю, что это можно ответить jcesarmobile в другом потоке: UIAlertController/UIAlertView scrolling on iOS 8

Обходные много людей добавили, чтобы иметь дело с предыдущие ошибки с длинным текстом в UIAlertController теперь приводят к этому сбою в 8.3. И проблема с длинным текстом исправлена ​​в 8.3, поэтому обходной путь можно сделать условным, чтобы избежать этого в 8.3.

1

У меня была проблема с similair, которая также упоминается в комментариях. Пожалуйста, смотрите это, если вы получаете.

*** Нагрузочное приложение из-за неперехваченное исключение 'NSInternalInconsistencyException', причина: «Ограничение компоновки еще нужно обновление после отправки -updateConstraints в < _UIKeyboardLayoutAlignmentView: 0x792d28e0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer =>. _UIKeyboardLayoutAlignmentView или один из его суперклассов может иметь переопределенные-updateConstraints без вызова super. Или что-то может иметь грязные ограничения компоновки в середине их обновления. Оба являются ошибками программирования. '

NSInteralInconsistencyException - UIKeyboardLayoutAlignmentView

0

Это исправлено немедленно (для меня). Я имел точно такую ​​же ошибку, что Крис описанный:

NSInteralInconsistencyException - UIKeyboardLayoutAlignmentView

Ответ был просто чтобы убедиться, что анимированный установлен на «NO» при представлении UIAlertController.

[self presentViewController:alert animated:NO completion:nil]; 
+0

Это может работать, когда проблема заключается в UIKeyboardLayoutAlignmentView, но если трассировка стека соответствует этому вопросу, авария возникает, когда текстовое поле добавляется к перед тем, как 'presentViewController' будет даже вызван. Ответ Базы разрешает это. – tobygriffin

+0

В моем приложении это не сработало для меня, но исправление в моей ссылке было сделано. Угадай его один из тех странных. Re: он приносит другое исправление оригинальному вопросу, да, мы знаем, но, как некоторые люди спрашивали об этом крахе, а также в этой теме. Так что лучше всего связать. – Chris

+0

Да, и всем спасибо за разъяснение этого различия для будущих зрителей. – Michael

6

Эта ошибка срабатывает, если посмотреть на UIAlertController в загрузке, когда вы звоните -addTextFieldWithConfigurationHandler: ([alert isViewLoaded] == YES).

Если доступ alert.view до вызова -addTextFieldWithConfigurationHandler, перемещать все, что вы делаете с alert.view, чтобы после вызова -addTextFieldWithConfigurationHandler:.

4

Как упоминалось в @Dex, я исправил это, изменив представление моего контроллера ПОСЛЕ добавления текстового поля. Я изменял цвет оттенка представления.

controller.view.tintColor = ...some color... 

Переместить это в «после», добавив текстовое поле, исправил его для меня. Принятый ответ и другие предложения привели к другим ошибкам для меня. Извините, у меня нет ответа, чтобы оставлять комментарии еще в ответ @ Dex.

+1

Это единственный ответ, который исправил проблему для меня. Благодаря! –

+1

@ Дайсон, вас больше всего приветствуют. Также стоит отметить, что это было надежным, так как я сделал это исправление еще в июне. – BigShay

+0

В моем коде была такая же проблема. Это решение разрешает это! – salabaha

0

Мне действительно не понравились решения, которые я видел, и придумал более простой. Сбой происходит (по крайней мере, для меня), когда клавиатура видна и отображается предупреждение с полем ввода.

Я просто увольняю клавиатуру перед представлением предупреждения, а затем все в порядке.

3

Это, похоже, связано с укладкой зрения UIAlertController, так как ускользает от @BigShay.

В моем примере я установил tintColor представления перед добавлением UITextField и я сбой в iOS 8. Обходной путь, данный @ Baza207 для добавления UITextField после отображения предупреждения, позволяет избежать сбоя в iOS 8, однако он также приводит к в текстовом поле вообще не отображается в iOS 9.

Если вы просто переместить стиль в после добавления текстового поля, он работает как с прошивкой 8 и IOS 9 (без аварии в прошивке 8, и не хватают текстового поля в прошивке 9):

Сбой в прошивке 8

Работает в прошивке 9

alertController.view.tintColor = UIColor.blueColor() 

alertController.addTextFieldWithConfigurationHandler { textField in 
} 

presentViewController(alertController, animated: true, completion: nil) 

Работает в прошивке 8

Нет текст текстового поля в прошивке 9

alertController.view.tintColor = UIColor.blueColor() 

presentViewController(alertController, animated: true, completion: nil) 

alertController.addTextFieldWithConfigurationHandler { textField in 
} 

Работает в IOS 8

Работает в прошивке 9

alertController.addTextFieldWithConfigurationHandler { textField in 
} 

alertController.view.tintColor = UIColor.blueColor() 

presentViewController(alertController, animated: true, completion: nil) 
Смежные вопросы