в iOS 13 [UIApplication sharedApplication] делегат] .window не работает с использованием target- c - PullRequest
1 голос
/ 03 февраля 2020

Мне нужно отобразить предупреждение от класса, который не является UIView, используя target- c.

Ниже приведен код:

 UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@“Sample” message message:@“hello message” preferredStyle:UIAlertControllerStyleAlert];

[alertVC addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {}]];

[[[UIApplication sharedApplication] delegate].window.rootViewController presentViewController:alertVC animated:YES completion:nil];

это выше не работает и Я не мог найти другую альтернативу для того же кода в target- c. Я наткнулся на эту ссылку Как решить: «keyWindow» устарел в iOS 13.0 , но решение в Swift, а не в цели- c.

Спасибо

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Проблема в том, что в iOS 13 это выражение ...

[[UIApplication sharedApplication] delegate].window.rootViewController

... равно nil. Это связано с тем, что свойство окна принадлежит делегату scene , а не делегату app . Вы бы лучше могли получить доступ к окну через приложение UIA . Например, просмотрите в приложении windows и найдите тот, который является ключевым.

1 голос
/ 04 февраля 2020

Вы пытаетесь представить viewcontroller в ключевом окне, которое создаст исключение. Попробуйте этот код

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Tap!" message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:action];
[self presentViewController:alert animated:YES completion:nil];
0 голосов
/ 03 февраля 2020

Я думаю, что в вашем случае проще всего использовать следующее в качестве замены вашей последней строки кода

[UIApplication.sharedApplication.windows.lastObject.rootViewController 
    presentViewController:alertVC animated:YES completion:nil];
...