Я сталкиваюсь с проблемами, из-за которых мое приложение забывает текущий контроллер представления и его свойства, а именно 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
Программируем под IOS
1716823598
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78532915/application-forgets-current-view-controller-and-tableview-after-alert-controller[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия