Представление UIAlertController (в стиле листа действий) вызвало загадочное предупреждение автомакета

Проблема может быть воспроизведена с помощью простого проекта, как показано ниже:

введите здесь описание изображения

Когда пользователь нажимает кнопку + на панели навигации, код создает экземпляр и представляет UIAlertController в стиле листа действий.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func buttonTapped(_ sender: Any) {
        let actionSheet = UIAlertController(title: nil,
                                            message: nil,
                                            preferredStyle: .actionSheet)
        actionSheet.addAction(UIAlertAction(title: "Create Income",
                                            style: .default) { _ in
                                                print("Income!") })
        actionSheet.addAction(UIAlertAction(title: "Create Outcome",
                                            style: .default) { _ in
                                                print("Outcome!")})
        actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ in })
        self.present(actionSheet, animated: true, completion: nil)
    }
}

Пользовательский интерфейс отображается правильно. Проблема заключается в том, что Xcode выдает следующие предупреждения автомакета при появлении листа действий:

2020-03-12 11:24:57.002113+0800 alertcontroler_test[12757:936231] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600002d11b30 UIView:0x7f851961c560.width == - 16   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600002d11b30 UIView:0x7f851961c560.width == - 16   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Я проверяю иерархию пользовательского интерфейса в Xcode, когда отображается лист действий, и обнаруживаю, что некоторые подпредставления сопровождаются восклицательным знаком:

введите здесь описание изображения

Я гуглил об этом, но не нашел людей, сообщающих о подобной проблеме (то есть предупреждениях автомакета, когда появляется UIAlertController). Я нашел некоторую информацию о том, как установить точку останова на UIViewAlertForUnsatisfiableConstraints() и как отлаживать ассемблерный код. Но я думаю, что это внутренняя проблема UIAlertController, и то, как я создаю и представляю UIAlertController, является обычным и типичным. Любое предложение, что мне делать?

Это можно найти в последней версии Xcode (11.3.1) и iOS (13.3). Проблема исчезнет, ​​если я изменю стиль на оповещение. Любая помощь будет принята с благодарностью.


person rayx    schedule 12.03.2020    source источник
comment
Я считаю, что вы ничего не можете с этим поделать, поскольку его макет выполняется iOS. Ошибки ограничений, подобные этой, случаются даже в SwiftUI.   -  person Glenn Posadas    schedule 12.03.2020
comment
@Glenn А, большое спасибо за информацию. Это мое первое приложение, и я успешно использовал довольно много других элементов управления и представлений пользовательского интерфейса (я имею в виду, что не видел никаких неожиданных предупреждений автомакета), поэтому я подумал, что это может быть моя ошибка. Я потратил на это все утро :(   -  person rayx    schedule 12.03.2020
comment
Ах! Я ломал голову над этим! Я тоже получаю эту странную ошибку макета -16 при представлении листов действий в моем приложении. Ничего не работает, не могу избавиться. Установка для анимации значения false (см. ниже) также не работает. Думаю, мне с этим жить...   -  person DeveloperSammy    schedule 17.11.2020


Ответы (1)


Это ошибка, которая не исправлена ​​​​командой Apple. Эта ошибка связана с предупреждениями и листами действий, связанными с анимацией. Вы можете перейти по этим ссылкам, чтобы убедиться в этом: -

UIAlertController actionSheet выдает ошибку ограничения на iOS 12.2/12.3

Нарушающие ограничения Swift по умолчанию AlertViewController

Решение для этого состоит в том, чтобы передать значение анимации как ложное, например: -

controller.present(alertController, animated: false, completion: nil)

Я представил UIAlertController без анимации, и предупреждение исчезло.

или вы можете попробовать это решение, упомянутое в одной из ссылок stackoverflow: -

@IBAction func buttonTapped(_ sender: UIButton) {
 ...
self.present(alertController,animated: true,completion: nil)



alertController.view.subviews.flatMap({$0.constraints}).filter{ (one: NSLayoutConstraint)-> (Bool)  in
  return (one.constant < 0) && (one.secondItem == nil) &&  (one.firstAttribute == .width)


}.first?.isActive = false

  }
person Apps Maven    schedule 12.03.2020
comment
Спасибо! Отключение анимации у меня не работает (Xcode 11.3.1, iOS 13.3. Я использую симулятор). Теперь, когда я знаю, что это не критическая проблема, я воздержусь от попыток других хаков, потому что у меня есть много других дел :) - person rayx; 12.03.2020