<FirstViewController: 0x2a2c00> için başlangıç ​​/ bitiş görünüm geçişlerine yönelik dengesiz çağrılar


93

Uygulamamı simüle ettiğimde bu sorunu yaşıyorum, bu bir hata veya uyarı değil, ancak konsolumda görünüyor, bunu daha önce hiç yaşayan oldu mu?


o görüntü denetleyicisinde bir tür animasyon yapıyor musunuz?

1
Evet. Görüntüleri birbirinden ayıran bir açılış animasyonum var, şimdi bu hatanın yalnızca telefona kod yüklediğimde gerçekleştiğini fark ettim.
C.Johns

hata mesajı bir geçişe başlamanızı önerir, ancak karşılık gelen son yöntem için eksik bir çağrı vardır.

1
Aynı şeyi aldım. Bunun için herhangi bir çözüm var mı?
seeafish

Ayrıca bunun için bir çözüm arıyorum
barfoon

Yanıtlar:


48

Benim durumumda, bir tablo görünümündeki iki sekmeyi çok hızlı tıkladığınızda bu hata oluşur.

Sonuç yanlış başlık adına neden olur, geri düğmesi kaybolur. Birisi bir görünüme bastığınızda bundan bahsetti set animated:NO. Hata kaybolur ancak yine de bazı garip davranışlara neden olur. İki görünümü iter, ardından tablo görünümü ekranına geri dönmek için iki kez geri gitmeniz gerekir.

Bu sorunu çözmek için denediğim yöntem:

Ekle BOOL cellSelected;

içinde viewWillAppear cellSelected = YES;

didselectcell'de delege if (cellSelected){cellSelected = NO; do action ; }

Bu, iki farklı hücrenin çok hızlı tıklanmasını önlemeye yardımcı olur.


5
Tahminimce bazı ifadelerin anlaşılması zordu. Okunabilirliği artırmak için birkaç düzenleme yaptım.
Kyle Clegg

42

Benim durumumda, [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];bir UINavigationControlleröğenin viewDidLoadyöntemi içinde tetiklediğimde oldu .

Onu viewDidAppearyönteme taşımak sorunu çözdü.

Bunun nedeni büyük olasılıkla viewDidLoadsüslü animasyonların hepsinde bitmemiş, oysa viewDidAppearher şey bitmiş olmasıdır.


Teşekkürler. Her bir UI öğesini 'kodla oluşturduğum mağara adamı çağında kendimi kaybettim. Hikaye panosu işleri benim için yeni.
Kiran Kulkarni


15

Bundan kaçınmak için kodunuzu farklı bir döngüde çalıştırmalısınız

 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];
        });

7
Daha iyi bir fikir, sunum animasyonunu bir dispatch_asyncana kuyruk içine almaktır. Önemli dispatch_asyncolan ana kuyruktaki diğer tüm animasyonlar bitene kadar beklemesidir. bir gecikme kullanmaktan çok daha iyidir çünkü: 1- Bir gecikmenin yeterli olup olmadığını asla bilemezsiniz, ana cihazınıza bağlıdır. 2- Gecikmeyi aşırıya kaçarsınız ve bir şeyler gecikir. bunu deneyin:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani

12

Aynı sorunla ilgili çok sorun yaşadım. Bu şekilde çözdüm

1) UIViewController'sBelirlenmiş başlatıcı kullanmıyorsunuz initWithNibName:bundle:. Sadece kullanmak yerine kullanmayı deneyin init.

2) animated:YESHAYIR olarak ayarlayın ve bu sorunu çözdü. Örneğin.[self.navigationController pushViewController: viewController_Obj animated:NO];


7

Gezinme denetleyicisini kullanarak aynı sorunu yaşadım ve diğer denetleyicileri ona ittim. Buffered Navigation Controller ve diğer birkaç yaklaşımı kullanmayı denedim , ancak benim için işe yaramadı. Bunu anlamak için biraz zaman harcadıktan sonra, önceki işlem (animasyon) devam ederken (sanırım yaklaşık 0,5 saniye süre) yeni görünüm denetleyicisine basmaya çalıştığınızda bu sorunun oluştuğunu fark ettim. Her neyse, navigasyon denetleyicisini delege ederek ve önceki animasyon bitimlerini bekleyerek hızlı çözüm yaptım.


Teşekkür ederim! Mantığımı görüntülemek içinDidAppear'ı taşımak durumuma yardımcı oldu.
Jaroslav

7

Bu yöntemlerin aşırı yüklenmesinde uygun süper yöntemi çağırmak için -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear'ı unutmadığınızdan emin olun. Örneğin benim durumumda yöntem adı şu şekilde eşleşmiyor:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

beliren ve kaybolan yöntemlerin uyumsuz olduğunu fark edin


Bu sorunu çözmek için yaklaşık iki saat harcadım ve ortaya çıkan da buydu. Arayan super.viewWillAppear()içinde viewDidDisappear().
Daniel Wood

Bu ipucu için teşekkürler. Tek sorunum bu değildi, ama yardımcı oldu!
Anthony C

4

'Başlangıç ​​/ bitiş görünüm geçişlerine yönelik dengesiz çağrılar'

Son ilgili animasyon tamamlanmadan önce bir animasyonun başladığını söylüyor. Öyleyse, yenisini itmeden önce herhangi bir görünüm kontrol cihazını kullanıyor musunuz? Yoksa köküne mi dönüyor? evet ise bunu animasyonsuz yapmayı dene yani[self.navigationController popToRootViewControllerAnimated:NO];

Ve bunun sorunu çözüp çözmediğine bakın, Benim durumumda hile yaptı.


1
Bu anahtar: aynı anda diğer görüntü denetleyici geçişlerini açın veya değiştirin.
Rocky

2

Bu sorunu, UITabbar olmadan bir viewController'dan bir UIPrintInteractionController çağırdığım ve ne UINavigationBar'ı çağırdığım için aldım. UIPrintInteractionController'ın doğru printInteractionControllerParentViewController'ı alamadığı görülüyor. Yöntemi temsilciye uygulamak ve benim için çalışan geçerli rootViewController'ı döndürmek.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

2

Modal diyalogların geri sarılmasını içeren benzer bir sorun yaşadım. Çözümü burada yayınladı ...

https://stackoverflow.com/a/38795258/324479

[Sorun]

Gezinme Denetleyicisi -> VC1 -Push -> VC2 -PopOver veya Modal Segue -> VC3.

VC3, VC1'e geri dönüyor.

VC2'den VC3'e Segue PopOver ve Modal olduğunda, çözme bir uyarı ile sona erer: UIViewController için görünüm geçişlerini başlatmak / bitirmek için dengesiz çağrılar "

VC'den VC'ye Segue itilirse, uyarı kaybolur.

[Çözüm]

Çözme mantığı bunu hallederse harika olurdu. Belki bu bir hatadır, belki de değildir. Her iki durumda da çözüm, VC2'yi (açılır pencereye sahip denetleyici) geri sarmanın hedefi yapmak, ardından nav denetleyicisini açmadan önce görünmesinin bitmesini beklemektir. Bu, geri sarma (ters açılır pencere) animasyonunun daha geri gitmeden önce bitirmek için yeterli zamana sahip olmasını sağlar. Animasyonlar kapalıyken bile beklemesi gerekir, yoksa hatayı alırsınız.

VC2 kodunuz aşağıdaki gibi olmalıdır. (Swift)

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)
        }
    }
}

1

Alt görünüm olarak modal görünüm denetleyicisine sahip bir görünüm ekliyorsanız durum oluşabilir. Kullanmak için en iyisi:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

Temel olarak, görüntü yaşam döngüsünün, o zaman görüntülemeye çalıştığınız viewControllers için düzenlenmediğini söylüyor.


1

Yapmaya çalışırken benzer bir sorun yaşıyorum:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

gibi bir işlevde - (void) popUpToLevelTwo;ve return;işlevin sonuna bir koymak sorunu çözer


1

Bunu da anladım

[self dismissModalViewControllerAnimated:YES];

Değiştim YESbir etmek NOve bu sorun çözüldü.


1

Gezinme denetleyicisinin pop yöntemini kullandığımda da aynı sorunu yaşıyorum Uygulamamda gezinme denetleyicisi için ayrı bir mantık kullanıyorum, Bu nedenle gezinme çubuğunun kullanımından kaçındım ve her zaman gizlidir. Ardından, geri düğmesi ve olaylarını işlemek için özel bir görünüm ve bildirim kullanıyorum. bildirim gözlemcileri kaydedilir ve kaldırılmaz. Böylece bildirim iki kez tetiklenir ve yukarıda belirtilen hatayı oluşturur. Bu tür hataları almak için kodunuzu iyice kontrol edin.


1

Ne 's değerinde için, ben bir çağrı içermeyen bu aynı hata var [super viewDidLoad:animated]benim de viewDidLoadgeçersiz kılma.


1
belki viewDidAppear'ı mı kastediyorsunuz? viewDidLoad parametresi yok
Fabio Napodano

1

Bir NIB'den bir düğmeye dokunduğumda da bu sorunu yaşadım. Bir olayı iki IBAction yöntemine göndermek için yanlışlıkla düğmeyi kablolamıştım, her biri bir pushViewController yaptı: animasyonlu


Teşekkürler !! zamanımı kurtarıyorsun !!
VD

1

UIViewControllerTüm veriler indirilene kadar zorlamayı beklemek için bazı mantık uyguladım . Bu mantıkta,UIViewController , devam eden başka bir API çağrısı varken çok erken vardı.

Aynı UIViewControllerşeyin iki kez itilmesine neden oldu UINavigationControllerve bu uyarıyı verdi.


1

Sebep mesaj için: Bu ileti görüntülenir olsun eğer ve bastırıyorlar yalnızca / diğerine Görünüm denetleyicisi sunulması viewWillAppear, loadView, initveya viewDidLoadyöntem Görüntüleme geçerli Kontrolör

Hata Mesajını Kaldırmanın Yolu: İtme / sunum kodunuzu viewDidAppearyönteme taşıyın sorunu çözecektir


1

Swift 4

Benim sorunum, mevcut olanımın işlenmesi tamamlanmadan önce başka bir VC sunmamdı.

Çözüm, hızlı bir gecikmeden sonra nextVC'mi sunmaktı.

YAPMAMANIZ GEREKENLER

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

NE YAPMALISINIZ

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)
}

4
Bir gecikme kullanmak yerine kodu viewDidAppear veya viewDidLayoutSubviews'e koyardım.
Pranav Kasetti

0

Break'i ayarlamayı unuttuğumda bu problemi yaşadım; görünümü bir geçiş ifadesiyle ittikten sonra!

Burası gibi:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

0

"Görünüş geçişlerini başlatmak / bitirmek için dengesiz çağrılar" hatasının arkasındaki neden, gezinmenizdir | aynı anda iki kez geçiş yap


0

bir çözüm olabilir,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

0

Bir UIViewController'ı yüklemesi tamamlanmadan önce kapatmaya çalışırsanız bununla karşılaşabilirsiniz.

Bu mesajı konsolda aldım ve tamamen yeni UIViewController'ı sunan UIViewController'a odaklanıyordum, başarılı olamadı. Sonunda sorunun, sunduğum UIViewController'da olduğunu keşfettim, çünkü kullanıcı hesabına giriş yapmadı.

Umarım bu birine yardımcı olur.


0

Bu benim için zordu: Ben geçersiz kıldım

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

geçersiz kılmaksızın:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

pencere kök gezinti denetleyicimde. daha sonra bir çocuk gezinme denetleyicisi yukarıda belirtilen uyarıyla başka bir görüntü denetleyicisine bastığında şikayet etti. Uyarı en kötüsü değildi, büyük sorun, çocuk gezinti denetleyicisinin temsilcisinin artık aranmamasıydı. Weired.


0

Benim durumumda ben getirilirken edildi NSDatadan NSURL'içeriden viewDidLoadyöntemiyle'.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.