Как я могу сделать так, чтобы мое приложение iOS вылетало, если представление выложено неоднозначно? - PullRequest
1 голос
/ 22 октября 2019

Я хочу уведомить разработчиков в моей команде и не дать им идти дальше, когда они создали представление с неоднозначными ограничениями. Для этого я хочу, чтобы телефон зависал (в режиме отладки). Я мог бы периодически опрашивать, чтобы увидеть, есть ли для каких-либо представлений в иерархии значение hasAmbiguousLayout, установленное в значение true, но это не очень хорошо. Тем не менее, похоже, что iOS сообщает о неоднозначных раскладках в своей области Runtime Issues. Таким образом, должен быть некоторый эквивалент UIViewAlertForUnsatisfiableConstraints для неоднозначных макетов. Как я могу сделать это сбой?

1 Ответ

1 голос
/ 24 октября 2019

Swizzle UIViewController.viewDidLayoutSubviews и UIView.layoutSubviews и assert !hasAmbiguousLayout == false

Вот пример игровой площадки:

import UIKit
import PlaygroundSupport

extension UIViewController {
  @objc private func swizzledViewDidLayoutSubviews() {
    assert(!view.hasAmbiguousLayout)
    print("inside the swizzledViewDidLayoutSubviews method for \(Self.self) ")
    swizzledViewDidLayoutSubviews()
  }

  private static let swizzleImplementation: Void = {
    guard let original = class_getInstanceMethod(UIViewController.self, #selector(UIViewController.viewDidLayoutSubviews as (UIViewController) -> () -> Void)),
      let swizzled = class_getInstanceMethod(UIViewController.self, #selector(UIViewController.swizzledViewDidLayoutSubviews)) else {
        return
    }
    method_exchangeImplementations(swizzled, original)
  }()

  static func swizzle() {
    _ = swizzleImplementation
  }
}

class V: UIViewController {}
UIViewController.swizzle()
let v = V()
PlaygroundPage.current.liveView = v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...