Подтвердить что ты не робот

IOS 8.3 Сбой в UIAlertController при попытке добавить текстовое поле

У меня есть приложение для iPad. Я создаю 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 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 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 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 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 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 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
4b9b3361

Ответ 1

Изменить: Это исправление изменяется в зависимости от того, строится ли с помощью Xcode 6 или Xcode 7, поэтому я добавил соответствующую информацию для обеих версий 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, он работает правильно в iOS 8 и iOS 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)

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Похоже, что это имеет отношение к стилю представления UIAlertController, так как ускользает от @BigShay.

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

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

Сбой в iOS 8

Работает в iOS 9

alertController.view.tintColor = UIColor.blueColor()

alertController.addTextFieldWithConfigurationHandler { textField in
}

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

Работает в iOS 8

Текстовое текстовое поле в iOS 9

alertController.view.tintColor = UIColor.blueColor()

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

alertController.addTextFieldWithConfigurationHandler { textField in
}

Работает в iOS 8

Работает в iOS 9

alertController.addTextFieldWithConfigurationHandler { textField in
}

alertController.view.tintColor = UIColor.blueColor()

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

Ответ 5

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

View not found in container hierarchy:

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

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

Кроме того, в кадрах определенно что-то не так.

Ответ 6

В сообщениях, связанных с 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.'

Оповещения без текстовых полей в порядке, но отображение 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];
}

Ответ 7

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

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

NSInteralInconsistencyException - UIKeyboardLayoutAlignmentView

Ответ 8

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

Ответ 9

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

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

  • Создайте новую ширину UIViewController, установите фон просмотра на черный с непрозрачностью 0,4.
  • Добавить 400x150 UIView с двумя кнопками, меткой и UITextField
  • Добавить ограничения и другие необходимые сотрудники You must see something like this
  • Подключить modally другие контроллеры с новым enter image description here
  • И укажите специальный класс для нового контроллера как "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

Ответ 10

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

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

Ответ 11

Это немедленно зафиксировало (для меня). У меня была такая же ошибка, что и Крис:

NSInteralInconsistencyException - UIKeyboardLayoutAlignmentView

Ответ заключался просто в том, чтобы убедиться, что анимированное настроено на "НЕТ" при представлении UIAlertController.

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

Ответ 12

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

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