Представление UIAlertController (в стиле actionheet) вызвало таинственное предупреждение об автоматическом размещении - PullRequest
1 голос
/ 12 марта 2020

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

enter image description here

Когда пользователь нажимает кнопку + на панели навигации, код создает и представляет 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, когда лист действий появляется, и нахожу, что некоторые подпредставления сопровождаются восклицательным знаком:

enter image description here

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

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

1 Ответ

1 голос
/ 12 марта 2020

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

actionSheet UIAlertController выдает ошибку ограничения для 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

  }
...