Я сталкиваюсь с проблемами, из-за которых мое приложение забывает текущий контроллер представления и его свойства, а именно 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
Приложение забывает текущий контроллер представления и представление таблицы после нажатия контроллера предупреждений в ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение