Приложение забывает текущий контроллер представления и представление таблицы после нажатия контроллера предупреждений в IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Приложение забывает текущий контроллер представления и представление таблицы после нажатия контроллера предупреждений в

Сообщение Anonymous »

Я сталкиваюсь с проблемами, из-за которых мое приложение забывает текущий контроллер представления и его свойства, а именно tableView, после запуска AlertController с методами действия.
Например, после представления предупреждения с помощью действия кнопки нажатие кнопки приводит к сбою, когда функция ссылается на табличное представление на экране, которое, по ее словам, равно нулю.
Рассматриваемый виртуальный инструмент встроен в навигационный контроллер и запускаемый модально из VC, который является частью UITabBarController
Таким образом, стек должен быть чем-то вроде UITabBarController -> UINavigationController -> ViewControllerOnScreen -> AlertController
Я решил предыдущую проблему, когда VC исчезал из стека (хотя все еще был на экране_) после нажатия на распознаватель UIGesture с помощью следующего метода:
func topVC() -> UIViewController {
var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController!
while (topController.presentedViewController != nil) {
topController = topController.presentedViewController!
}
return topController
}

В этом случае мне просто нужно было запустить оповещение. TopVC в предыдущем методе был ViewController на экране, и он успешно запустил предупреждение.
Однако теперь это tableView на экране, который равен нулю. tableView является свойством VC и объявлен как IBOutlet
@IBOutlet var tableView : UITableView!

Однако в этом случае, когда я вызываю метод topVC, указанный выше, topVC является навигационнымконтроллером, а не виртуальным виртуальным элементом на экране, поэтому у него нет свойства tableView.
/>Есть ли способ сослаться на нужный мне виртуальный компьютер (тот, что на экране) из навигационного контроллера?
Буду очень признателен за любые предложения.
Изменить:
Как предложил Кармен, в предоставленной ссылке есть много ответов.
Я собрал их вместе следующим образом, но все еще не получаю фактический виртуальный виртуальный объект, содержащий свойства. Я просто получаю UINavigationController:
extension UIWindow {
func visibleController() -> UIViewController? {
var top = self.rootViewController
while true {
if let presented = top?.presentedViewController {
top = presented
} else if let nav = top as? UINavigationController {
top = nav.visibleViewController
} else if let tab = top as? UITabBarController {
top = tab.selectedViewController
} else {
break
}
}
return top
}
}

Поскольку у меня есть alertController, я подозреваю, что возникла проблема с ключевым окном. Этот ответ в Objective-C по ссылке решает проблему keyWindow с alertController, но я изо всех сил пытаюсь перевести на Swift:
-(UIWindow *) returnWindowWithWindowLevelNormal
{
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *topWindow in windows)
{
if (topWindow.windowLevel == UIWindowLevelNormal)
return topWindow;
}
return [UIApplication sharedApplication].keyWindow;
}

-(UIViewController *) getTopMostController
{
UIWindow *topWindow = [UIApplication sharedApplication].keyWindow;
if (topWindow.windowLevel != UIWindowLevelNormal)
{
topWindow = [self returnWindowWithWindowLevelNormal];
}

UIViewController *topController = topWindow.rootViewController;
if(topController == nil)
{
topWindow = [UIApplication sharedApplication].delegate.window;
if (topWindow.windowLevel != UIWindowLevelNormal)
{
topWindow = [self returnWindowWithWindowLevelNormal];
}
topController = topWindow.rootViewController;
}

while(topController.presentedViewController)
{
topController = topController.presentedViewController;
}

if([topController isKindOfClass:[UINavigationController class]])
{
UINavigationController *nav = (UINavigationController*)topController;
topController = [nav.viewControllers lastObject];

while(topController.presentedViewController)
{
topController = topController.presentedViewController;
}
}

return topController;
}


Подробнее здесь: https://stackoverflow.com/questions/785 ... controller
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»