UIAlert больше не открывается, Xcode говорит мне отладить NSLayoutConstraintToNilAnchor - PullRequest
0 голосов
/ 22 марта 2019

Без изменения чего-либо в контроллере представления или обновления до новой версии XCode отображение UIAlertController больше не работает.

Xcode выдает мне сообщение об ошибке: Метод фабрики ограничений был передан без привязки макета.Это недопустимо и может вызвать непонятные исключения.Перерыв на BOOL _NSLayoutConstraintToNilAnchor (void) для отладки.Это будет зарегистрировано только один раз.Это может сломаться в будущем.

Теперь я успешно попытался отладить его с точкой останова, указанной в сообщении об ошибке.

Вот что я получил:

Foundation`_NSLayoutConstraintToNilAnchor:
->  0x1b51342ec <+0>:  pacibsp 
    0x1b51342f0 <+4>:  sub    sp, sp, #0x30             ; =0x30 
    0x1b51342f4 <+8>:  stp    x20, x19, [sp, #0x10]
    0x1b51342f8 <+12>: stp    x29, x30, [sp, #0x20]
    0x1b51342fc <+16>: add    x29, sp, #0x20            ; =0x20 
    0x1b5134300 <+20>: adrp   x19, 224497
    0x1b5134304 <+24>: ldrb   w8, [x19, #0xd30]
    0x1b5134308 <+28>: tbnz   w8, #0x0, 0x1b5134334     ; <+72>
    0x1b513430c <+32>: adrp   x8, 366
    0x1b5134310 <+36>: add    x8, x8, #0x30a            ; =0x30a 
    0x1b5134314 <+40>: adrp   x9, 196084
    0x1b5134318 <+44>: add    x9, x9, #0x2a8            ; =0x2a8 
    0x1b513431c <+48>: stp    x9, x8, [sp]
    0x1b5134320 <+52>: adrp   x0, 196084
    0x1b5134324 <+56>: add    x0, x0, #0x288            ; =0x288 
    0x1b5134328 <+60>: bl     0x1b5105f6c               ; NSLog
    0x1b513432c <+64>: orr    w8, wzr, #0x1
    0x1b5134330 <+68>: strb   w8, [x19, #0xd30]
    0x1b5134334 <+72>: ldp    x29, x30, [sp, #0x20]
    0x1b5134338 <+76>: ldp    x20, x19, [sp, #0x10]
    0x1b513433c <+80>: add    sp, sp, #0x30             ; =0x30 
    0x1b5134340 <+84>: retab  

IЯ должен признать, что эта отладка немного мне не известна.

И это мой Код для отображения Предупреждения:

let vc = UIViewController()
        pickerData = data
        vc.preferredContentSize = CGSize(width: 250,height: 275)
        let pickerView = UIPickerView(frame: CGRect(x: 0, y: 0, width: 250, height: 275))
        pickerView.delegate = self
        pickerView.dataSource = self
        if let index = data.firstIndex(of: "Std.") {
            pickerView.selectRow(index , inComponent: 0, animated: false)
        }

        vc.view.addSubview(pickerView)

        let alert = UIAlertController(title: title, message: "", preferredStyle: UIAlertController.Style.alert)
        alert.setValue(vc, forKey: "contentViewController")
        let defaultAction = UIAlertAction(title: "Save", style: .default) {
            (result : UIAlertAction) -> Void in

            ***

            self.dismiss(animated: true)
        }
        alert.addAction(defaultAction)
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

        self.present(alert, animated: true)

Точка останова явно останавливается на последней строке:

self.present(alert, animated: true)

В чем может быть ошибка?

1 Ответ

1 голос
/ 22 марта 2019
alert.setValue(vc, forKey: "contentViewController")

Это определенно не публичный API и может быть взломан в любой момент (например, сейчас).Я рекомендую не использовать его, поскольку это может привести к удалению приложения из AppStore.
Я рекомендую вместо взлома UIAlertController реализовать собственное всплывающее окно или использовать существующие библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...