У меня возникает эта проблема, когда я моделирую свое приложение, это не ошибка или предупреждение, но оно появляется в моей консоли, кто-нибудь когда-либо сталкивался с этим раньше?
У меня возникает эта проблема, когда я моделирую свое приложение, это не ошибка или предупреждение, но оно появляется в моей консоли, кто-нибудь когда-либо сталкивался с этим раньше?
Ответы:
В моем случае эта ошибка возникает, когда вы очень быстро нажимаете две вкладки в табличном представлении.
Результат вызывает неправильное название, кнопка возврата исчезает. Кто - то сказал , что , когда вы нажимаете вид, set animated:NO
. Ошибка исчезнет, но по-прежнему вызывает странное поведение. Он подталкивает два представления, затем вам нужно дважды вернуться, чтобы вернуться к экрану просмотра таблицы.
Метод, который я пробовал решить эту проблему:
Добавить BOOL cellSelected;
в viewWillAppear
cellSelected = YES;
в didselectcell делегат if (cellSelected){cellSelected = NO; do action ; }
Это помогает предотвратить быстрое нажатие на две разные ячейки.
В моем случае это произошло, когда я сработал [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
в методе UINavigationController
элемента viewDidLoad
.
Перенос его в viewDidAppear
метод решил проблему.
Причина, скорее всего, в том, что viewDidLoad
не все причудливые анимации уже закончены, тогда как во viewDidAppear
всех уже сделано.
У меня тоже есть эта проблема. Я нашел два решения этой проблемы:
UINavigationController
котором эта проблема решена. Буферизованный контроллер навигацииВы должны запускать свой код в другом цикле, чтобы избежать этого
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
});
dispatch_async
главную очередь. Дело в том, dispatch_async
что он ждет, пока все остальные анимации в основной очереди не будут выполнены. это намного лучше, чем использование задержки, потому что: 1 - вы никогда не узнаете, достаточно ли задержки, это зависит от вашего хост-устройства; 2 - вы в конечном итоге переусердствуете с задержкой, и что-то будет отставать. попробуйте это:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
У меня было много проблем с той же проблемой. Я решил это таким образом
1) Вы не используете UIViewController's
назначенный инициализатор initWithNibName:bundle:
. Попробуйте использовать его вместо просто init
.
2) установите animated:YES
NO, и это решило проблему. например.[self.navigationController pushViewController: viewController_Obj animated:NO];
У меня была такая же проблема с использованием контроллера навигации и подталкивания к нему других контроллеров. Я пытался использовать буферный контроллер навигации и несколько других подходов, но у меня это не сработало. Потратив некоторое время на то, чтобы разобраться в этом, я заметил, что эта проблема возникает, если вы пытаетесь нажать новый контроллер представления во время выполнения предыдущей транзакции (анимации) (я думаю, около 0,5 секунды). В любом случае, я быстро решил, что делегировал навигационный контроллер и дождался завершения предыдущей анимации.
Убедитесь, что вы не забыли в -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear вызвать правильный супер-метод в вашей перегрузке этих методов. Например, в моем случае я не совпал с именем метода следующим образом:
-(void)viewDidAppear
{
[super viewDidDisappear];
//some code staff
..
}
Обратите внимание , что появляются и исчезают методы являются несовпадающими
super.viewWillAppear()
внутри viewDidDisappear()
.
«Несбалансированные вызовы для начала / завершения смены появления для»
Говорит, что анимация запускается до того, как последняя связанная анимация не завершена. Итак, вы открываете какой-либо контроллер представления, прежде чем нажимать новый? Или может выскакивает рут? если да, попробуйте сделать это без анимации, т.е.[self.navigationController popToRootViewControllerAnimated:NO];
И посмотрите, решит ли это проблему. В моем случае это помогло.
У меня возникла эта проблема, потому что я вызывал UIPrintInteractionController из viewController без UITabbar и без UINavigationBar. Похоже, что UIPrintInteractionController не получил правильный printInteractionControllerParentViewController. Реализация метода в делегате и возврат текущего rootViewController сработали для меня.
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
У меня была аналогичная проблема, связанная с перемоткой модальных диалогов. Выложил решение здесь ...
https://stackoverflow.com/a/38795258/324479
[Проблема]
Контроллер навигации -> VC1 -Push -> VC2 -PopOver или Modal Segue -> VC3.
VC3 возвращается к VC1.
Когда переход от VC2 к VC3 является PopOver и Modal, раскрутка заканчивается предупреждением: несбалансированные вызовы для начала / завершения переходов внешнего вида для UIViewController "
Если переход от VC к VC нажат, предупреждение исчезнет.
[Решение]
Было бы здорово, если бы логика размотки позаботилась об этом. Может это ошибка, а может и нет. В любом случае решение состоит в том, чтобы сделать VC2 (контроллер, у которого есть всплывающее окно) целью перемотки, а затем дождаться его появления, прежде чем выскакивать контроллер навигации. Это гарантирует, что анимация перемотки назад (всплывающее окно в обратном направлении) успеет закончиться, прежде чем двигаться дальше назад. Даже при отключенной анимации он должен подождать, иначе вы получите ошибку.
Ваш код для VC2 должен быть следующим. (Свифт)
class VC2: UIViewController {
private var unwind = false
@IBAction func unwindToVC1(segue:UIStoryboardSegue) {
unwind = true
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if unwind {
self.navigationController?.popViewControllerAnimated(false)
}
}
}
Ситуация может возникнуть, если вы добавляете представление с контроллером модального представления в качестве подчиненного представления. Лучше всего использовать:
-(void) viewDidAppear:(BOOL)animated {
[self presentViewController:self.yourModalVC animated:YES completion:nil];
}
По сути, это означает, что жизненный цикл представления не оптимизирован для тех viewControllers, которые вы пытаетесь отобразить.
У меня такая же проблема, когда я использовал метод pop контроллера навигации. В моем приложении я использую отдельную логику для контроллера навигации, поэтому я избегал использования панели навигации, и она всегда скрыта. Затем я использую настраиваемый вид и уведомление для обработки кнопки возврата и ее событий. наблюдатели уведомлений регистрируются и не удаляются. Таким образом, уведомление срабатывает дважды и создает вышеупомянутую ошибку. Тщательно проверьте свой код на наличие таких ошибок
Как бы то ни было, я получил ту же ошибку, когда не включил вызов [super viewDidLoad:animated]
в мое viewDidLoad
переопределение.
У меня тоже была эта проблема, когда я нажимал кнопку на NIB. Оказывается, я случайно подключил кнопку для отправки события двум методам IBAction, каждый из которых выполнял pushViewController: animated:
У меня была реализована некоторая логика, чтобы дождаться нажатия, UIViewController
пока не будут загружены все данные. В этой логике была ошибка, из-за которой UIViewController
слишком рано был запущен, пока выполнялся еще один вызов API.
Это вызвало UIViewController
двойное нажатие того же самого UINavigationController
и выдало это предупреждение.
Причина для сообщения: Это сообщение отображается , если получить и только тогда , когда вы толкание / представляя другой контроллер Вида с viewWillAppear
, loadView
, init
или viewDidLoad
методом текущего View Controller
Способ удаления сообщения об ошибке: переместите код отправки / представления в viewDidAppear
метод, который решит проблему
Swift 4
Моя проблема заключалась в том, что я представлял еще одну VC до того, как закончился рендеринг моей текущей.
Решение состояло в том, чтобы представить мой следующий ВК после небольшой задержки.
ЧТО НЕ СЛЕДУЕТ ДЕЛАТЬ
override func viewDidLoad() {
super.viewDidLoad()
self.present(MyNextVC(), animated: true, completion: nil)
}
ЧТО ТЫ ДОЛЖЕН ДЕЛАТЬ
override func viewDidLoad() {
super.viewDidLoad()
//Wait until the view finished to be constructed
perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}
@objc func showCityList() {
self.present(MyNextVC(), animated: true, completion: nil)
}
У меня была эта проблема, когда я забыл установить Break; после нажатия представления в операторе switch!
Как здесь:
case 1:{
SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
[self.navigationController pushViewController:someViewController animated:YES];
[someViewController release];
}
break; //Forgetting to set break here:
одно решение было бы,
[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];
Вы можете столкнуться с этим, если попытаетесь закрыть UIViewController до того, как он загрузится.
У меня было это сообщение в консоли, и я полностью сосредоточился на UIViewController, который безуспешно представлял новый UIViewController. Наконец я обнаружил, что проблема заключалась в том, что UIViewController, который я представлял, самоустраивался, потому что пользователь не вошел в свою учетную запись.
Надеюсь, это кому-то поможет.
Для меня это было непросто: я переопределил
override func shouldAutomaticallyForwardRotationMethods() -> Bool {
return true
}
без отмены:
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
return true
}
в моем оконном контроллере корневой навигации. затем дочерний контроллер навигации пожаловался на нажатие другого контроллера представления с вышеупомянутым предупреждением. Предупреждение было не самым ужасным, большая проблема заключалась в том, что делегат дочернего контроллера навигации больше не вызывался. Weired.