У мене є ця проблема, коли я імітую свою програму, її не помилка чи попередження, але вона з’являється в моїй консолі, хтось коли-небудь відчував це раніше?
У мене є ця проблема, коли я імітую свою програму, її не помилка чи попередження, але вона з’являється в моїй консолі, хтось коли-небудь відчував це раніше?
Відповіді:
У моєму випадку ця помилка виникає, коли ви дуже швидко натискаєте дві вкладки в таблиці.
Результат викликає неправильне ім’я, кнопка "назад" зникає. Хто - то сказав , що , коли ви натискаєте вид, 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 - ви ніколи не дізнаєтесь, чи достатньо затримки, це залежить від вашого хост-пристрою, - ви в кінцевому підсумку перестараєтеся із затримкою і щось буде відставати. спробуйте так: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 не отримав правильного друкуInteractionControllerParentViewController. Реалізація методу в делегаті та повернення поточного rootViewController працював на мене.
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
У мене була подібна проблема, яка стосувалася перемотування модальних діалогів. Тут розміщено рішення ...
https://stackoverflow.com/a/38795258/324479
[Проблема]
Nav Controller -> VC1 -Push -> VC2 -PopOver або Modal Segue -> VC3.
VC3 повертається до VC1.
Коли Segue від VC2 до VC3 є PopOver і Modal, розмотка закінчується попередженням: Незбалансовані дзвінки для початку / закінчення переходів для UIViewController "
Якщо Segue від 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, які ви намагаєтеся відобразити тоді.
У мене є така ж проблема, коли я використовував поп-метод навігаційного контролера. У своїй програмі я використовую окрему логіку для навігаційного контролера, тому уникаю використання панелі навігації, і це завжди приховано. Тоді я використовую спеціальний перегляд та сповіщення для обробки зворотної кнопки та її подій. спостерігачі сповіщення реєструються та не видаляються. Тож повідомлення сповіщається двічі, і це створює згадану вище помилку. Ретельно перевіряйте свій код на наявність таких несправностей
Оскільки це варте, я отримав цю саму помилку, коли не включив дзвінок [super viewDidLoad:animated]
у свою viewDidLoad
переоцінку.
У мене також була ця проблема, коли я натиснув кнопку від NIB. Виявляється, я випадково підключив кнопку для надсилання події до двох методів IBAction, кожен з яких виконував pushViewController: animated:
У мене була реалізована логіка, щоб чекати натискання, UIViewController
поки всі дані не будуть завантажені. У цій логіці виникла помилка, яка призвела до UIViewController
надмірного натискання, поки ще йшов інший виклик API.
Це спричинило те, що UIViewController
два рази натиснули на це, UINavigationController
і дало це попередження.
Причина для повідомлення: Це повідомлення відображається , якщо отримати і тільки тоді , коли ви штовхання / представляючи інший контролер Віда з viewWillAppear
, loadView
, init
або viewDidLoad
методом поточного View Controller
Спосіб видалення повідомлення про помилку: Перемістіть свій притискаючий / подаючи код до viewDidAppear
методу, це вирішить проблему
Швидкий 4
Моє питання полягало в тому, що я представляв ще один ВК до того, як мій поточний закінчився.
Рішення полягало в тому, щоб після швидкої затримки представити свій наступний ВК.
ЩО ВАМ НЕ ЗРОБИТИ
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
}
в моєму контролері кореневої навігації вікна тоді дочірній навігаційний контролер скаржився, коли натискав на інший контролер подання з вищезазначеним попередженням. Попередження було не найгірше, велика проблема полягала в тому, що там делегата контролера дочірньої навігації більше не викликали. норов.