Görünümü pencere hiyerarşisinde olmayan UIViewController'da UIViewController'ı sunma girişimi


599

Xcode 4.5 kullanmaya yeni başladım ve konsolda şu hatayı aldım:

Uyarı: Görünümü pencere hiyerarşisinde olmayan <ViewController: 0x1ec3e000> üzerinde <finishViewController: 0x1e56e0a0> sunmaya çalışın!

Görünüm hala sunuluyor ve uygulamadaki her şey iyi çalışıyor. Bu iOS 6'da yeni bir şey mi?

Bu görünümler arasında değiştirmek için kullandığım kod:

UIStoryboard *storyboard = self.storyboard;
finishViewController *finished = 
[storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];

[self presentViewController:finished animated:NO completion:NULL];

3
Aynı presentViewController:animated:completiondenetleyiciyi aramaya çalışmak dışında, aynı sorunu yaşıyorum . Bunu uygulama temsilcisinde mi yapıyorsunuz?
tarnfeld

Hayır bunu bir görüntü denetleyicisinden diğerine yapıyorum. Herhangi bir çözüm buldunuz mu?
Kyle Goslan

Her zaman Xcode 4.5 kullanmadan önce çalışan kod parçası aynı sorun, bir UINavigationController sunuyorum, ama yine bu daha önce de çalıştı.
Emanuele Fumagalli

Aynı problemim var, çözülmedi. Uygulama temsilci ve bir UITabBarController beeing "presentViewController" çağıran rootviewcontroller.
darksider

3
Ayrıca, makeKeyAndVisible çağırmadan önce bu yöntemi çağırırsanız, bundan sonra taşıyın
mike_haney

Yanıtlar:


1296

Bu yöntemi nereden çağırıyorsunuz? viewDidLoadYöntem içinde bir kalıcı görünüm denetleyicisi sunmaya çalıştığım bir sorun vardı . Benim için çözüm, bu çağrıyı viewDidAppear:yönteme taşımaktı .

Benim tahminim bir görünüm kontrolörün görünümü olduğunu değil (o yüklenmiş o noktada pencerenin görünümü hiyerarşisinde viewDidLoadmesajı gönderilir), ancak bir o takdim edildikten sonra pencere hiyerarşisinde (zaman viewDidAppear:mesaj gönderilir) .


Dikkat

Eğer presentViewController:animated:completion:içinde bir çağrı viewDidAppear:yaparsanız, görünüm kontrolörünün görünümü her göründüğünde (mantıklı!) Her zaman modsal görünüm kontrolörünün sunulduğu ve böylece sunulan modsal görünüm kontrolörünün asla gitmeyeceği bir sorunla karşılaşabilirsiniz. .

Belki bu, modsal görünüm kontrolörünü sunmak için en iyi yer değildir veya belki de model görünüm kontrolörünün modsal görünüm kontrol cihazını hemen sunup sunmayacağına karar vermesine izin veren bazı ek durumların saklanması gerekir.


6
@James Eğer görünümü görünüşte kadar hiyerarşi içinde değil, doğru sonra viewWillAppear çözüldüğünü ve viewDidAppear denilen edildikten sonra. Bu benim sorum olsaydı bu cevabı kabul ederdim;)
Matt Mc

6
@james Teşekkürler. ViewDidAppear'ı kullanmak benim için de sorunu çözdü. Mantıklı.
Ali

44
Keşke bunu iki kez değerlendirebilseydim. Ben sadece bu sorun vardı ve ben zaten son gördüğümde upvoted olduğunu bulmak için konu geldi.
Schrockwell

7
ViewDidAppear'da VC'yi değiştirdiğinizde, bunun Animasyon ile bir segue yürütülmesine neden olduğunu unutmayın. Arka planın yanıp sönmesine / görüntülenmesine neden olur.
Vincent

2
Evet, püf noktası viewWillAppear: (BOOL) doğru olduğu gibi canlandırılmıştır. [Super viewDidAppear: animated]; yöntemde super olarak adlandırmanız gereken bir diğer önemli şey; bu olmadan işe yaramıyor.
Mart'ta BootMaker

66

Başka bir olası neden:

Aynı görüntü denetleyicisini yanlışlıkla iki kez sunarken bu sorunu yaşadım. (Bir kez performSegueWithIdentifer:sender:, düğmeye basıldığında çağrıldı ve ikinci kez doğrudan düğmeye bağlı bir segue ile).

Etkili, iki segue aynı anda ateş ediyordu ve hatayı aldım: Attempt to present X on Y whose view is not in the window hierarchy!


4
Aynı hatayla karşılaştım ve buradaki cevabınız neler olup bittiğini
anlamama

1
Eski sekmeyi sildim ve VC'yi VC'ye bağladım. Düğmeyi storyBoard'a VC'ye bağlamanın bir yolu var mı, çünkü bu şekilde benim için hata yapmaya devam ediyor mu?
MCB

Aynı hatayla karşılaştım, cevabınız sorunumu çözdü, ilginiz için teşekkürler. Saygılarımla.
iamburak

1
lol, yanlışlıkla ben de iki vc's oluyordu: düğme ve performSegue, ipucu için teşekkürler !!!
17'de Borzh

1
Benim durumumda present(viewController, animated: true, completion: nil)bir döngü içine çağırıyordum .
Samo

38

viewWillLayoutSubviewsve viewDidLayoutSubviews(iOS 5.0+) bu amaçla kullanılabilir. ViewDidAppear'dan daha erken çağrılırlar.


3
Yine de başka durumlarda da kullanılırlar, bu yüzden bir görünümün "kullanım ömrü" içinde birkaç kez çağrılabileceklerini düşünüyorum.
Jonny

Adından da anlaşılacağı gibi, yöntemlerin ne olduğu da değildir. viewDidAppear doğru. Görünüm yaşam döngüsünü okumak iyi bir fikirdir.
alet kullanıcısı

Bu en iyi çözüm. Benim durumumda, viewDidAppear'da sunmak, mod yüklenmeden önce görünüm denetleyicisinin bölünmüş ikinci gösterilmesine neden olur ve bu kabul edilemez.
TMilligan

Bu cevap, bir uyarı görüntülemeye çalışırken benim için en iyisi oldu. Ben viewDidLoad ve viewWillAppear içine koymak zaman uyarı görünmez.
uplearnedu.com

26

Herhangi bir alt görünümü ana görünüme görüntülemek için, lütfen aşağıdaki kodu kullanın

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController presentViewController:composeViewController animated:YES completion:nil];

Herhangi bir alt görünümü ana görünümden çıkarmak için, lütfen aşağıdaki kodu kullanın

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController dismissViewControllerAnimated:YES completion:nil];

Benim için de çalıştı
Aziz Javed

17

Bir sunmaya çalıştım ben de bu sorunla karşılaştı UIViewControllerin viewDidLoad. James Bedford'ın cevabı işe yaradı, ancak uygulamam arka planı ilk olarak 1 veya 2 saniye gösterdi.

Biraz araştırma yaptıktan sonra, bunu kullanarak çözmenin bir yolunu buldum addChildViewController.

- (void)viewDidLoad
{
    ...
    [self.view addSubview: navigationViewController.view];
    [self addChildViewController: navigationViewController];
    ...
}

9
Sanırım eksik [navigationViewController didMoveToParentViewController: self]
foFox

2
Kodunuzu foFox'un önerisiyle birlikte denedim ve üst öğesinden kaldırmaya gittiğimde, gitmeyecek. Lololol. Hala düzeltmeden takılıp kaldım.
Logicsaurus Rex

Swift3.1
Kang Byul'da

@ sunkehappy presentviewcontroller önce kullanılacak iki satır üzerinde, ama neden çöktü?
Iyyappan Ravi

14

Muhtemelen, benim gibi, yanlış bir köke sahipsiniz viewController

ViewControllerBir non-UIViewControllerbağlamda görüntülemek istiyorum ,

Bu yüzden bu kodu kullanamıyorum:

[self presentViewController:]

Yani, bir UIViewController alıyorum:

[[[[UIApplication sharedApplication] delegate] window] rootViewController]

Bazı nedenlerden dolayı (mantıksal hata), rootViewControllerbeklenenden farklı bir şeydir (normal UIViewController). Sonra rootViewControllerbir ile değiştirerek hatayı düzeltirim UINavigationControllerve sorun giderildi.


8

TL; DR Yalnızca 1 rootViewController ve en son sunulanı olabilir. Bu nedenle, zaten reddedilmemiş bir tane sunulduğunda bir viewcontroller'ı başka bir viewcontroller sunmaya çalışmayın.

Kendi testlerimi yaptıktan sonra bir sonuca vardım.

Her şeyi sunmak istediğiniz bir rootViewController varsa, bu sorunla karşılaşabilirsiniz.

İşte rootController kodum (open, root'tan bir viewcontroller sunmak için benim kısayolum).

func open(controller:UIViewController)
{
    if (Context.ROOTWINDOW.rootViewController == nil)
    {
        Context.ROOTWINDOW.rootViewController = ROOT_VIEW_CONTROLLER
        Context.ROOTWINDOW.makeKeyAndVisible()
    }

    ROOT_VIEW_CONTROLLER.presentViewController(controller, animated: true, completion: {})
}

Eğer arka arkaya iki kez açık ararsam (geçen süre ne olursa olsun), bu ilk açıkta iyi çalışır, ancak ikinci açıkta DEĞİL. İkinci açık deneme yukarıdaki hataya neden olacaktır.

Ancak en son sunulan görünümü kapatın ve sonra açık çağrı, ben tekrar (başka bir viewcontroller) açık aradığınızda iyi çalışıyor.

func close(controller:UIViewController)
{
    ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}

Ne sonuç var sadece MOST-RECENT-CALL rootViewController görünüm Hiyerarşisi üzerinde (onu kapatmak veya bir görünümü kaldırmak bile). Tüm yükleyici çağrıları (viewDidLoad, viewDidAppear ve gecikmeli gönderme çağrıları yapıyor) ile oynamaya çalıştım ve işe almak için tek yolu SADECE en üst görünüm denetleyicisinden mevcut çağırıyor olduğunu bulduk.


Bu, çok sayıda cevabın size oy verdiği çok daha yaygın bir konu gibi görünüyor. Talihsiz, bu son derece yardımcı oldu
rayepps

evet iyi ve iyi ama çözüm nedir ... ben bir sunucuya gidiyor ve sağ ve orta solda storyboards görüntüleme bir arka plan iş parçacığı var ve tüm metodoloji sahte .. Bu korkunç .. ne bir esinti olmalı tamamen bir şaka çünkü al int arka plan iş parçacığı yapmak istiyorum: wait wait decide push screen to frontve bu imkansız ios olduğunu ????
Bay Heelis

5

Benim sorunum pencerede çağırmadan önce UIApplicationDelegate's didFinishLaunchingWithOptionsyönteminde segue gerçekleştiriyordu oldu makeKeyAndVisible().


Nasıl? detaylandırabilir misin aynı sorunla karşı karşıyayım. UIViewController self.window .rootViewController = initialViewControlleripad self.window .makeKeyAndVisible () olarak?: UIViewController = mainStoryboardIpad.instantiateViewController ( "SplashController" withIdentifier:) bu benim kod initialViewControlleripad izin vermek
shahtaj Khalid

4

Benim durumumda, benimkini bir sınıf geçersiz kılma işlemine koyamadım. İşte sahip olduğum şey:

let viewController = self // I had viewController passed in as a function,
                          // but otherwise you can do this


// Present the view controller
let currentViewController = UIApplication.shared.keyWindow?.rootViewController
currentViewController?.dismiss(animated: true, completion: nil)

if viewController.presentedViewController == nil {
    currentViewController?.present(alert, animated: true, completion: nil)
} else {
    viewController.present(alert, animated: true, completion: nil)
}

3

Ben de aynı problemi yaşadım. Bir navigasyon kontrolörü yerleştirip kontrol cihazını sunmam gerekiyordu. Örnek kod aşağıdadır.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImagePickerController *cameraView = [[UIImagePickerController alloc]init];
    [cameraView setSourceType:UIImagePickerControllerSourceTypeCamera];
    [cameraView setShowsCameraControls:NO];

    UIView *cameraOverlay = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 768, 1024)];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"someImage"]];
    [imageView setFrame:CGRectMake(0, 0, 768, 1024)];
    [cameraOverlay addSubview:imageView];

    [cameraView setCameraOverlayView:imageView];

    [self.navigationController presentViewController:cameraView animated:NO completion:nil];
//    [self presentViewController:cameraView animated:NO completion:nil]; //this will cause view is not in the window hierarchy error

}


3

Aynı sorunu yaşadım. Sorun, performSegueWithIdentifier bir uyarı ile tetiklendi, bildirimi ana iş parçacığına koyar koymaz uyarı mesajı gitmişti.


3

İyi çalışıyor bunu deneyin. bağlantı

UIViewController *top = [UIApplication sharedApplication].keyWindow.rootViewController;
[top presentViewController:secondView animated:YES completion: nil];

3

Kimseye yardım etmesi durumunda benim sorunum çok saçma oldu. Tamamen benim hatam elbette. Bir bildirim, modsalı çağıran bir yöntemi tetikliyordu. Ancak bildirimi doğru bir şekilde kaldırmıyordum, bu yüzden bir noktada birden fazla bildirimim olurdu, bu yüzden modal birden fazla kez çağrılacaktı. Elbette, bir kez modal çağırdıktan sonra, onu çağıran viewcontroller artık görünüm hiyerarşisinde değil, bu yüzden bu sorunu görüyoruz. Benim durumum da beklediğiniz gibi bir sürü başka soruna neden oldu.

Özetlemek gerekirse, ne yaparsanız yapın modun bir kereden fazla çağrılmadığından emin olun .


3

Nihayet bana (Swift) işe yarayan böyle bir kod ile sonuçlandım viewController, neredeyse her yerden görüntülemek istediğinizi düşünüyoruz . Bu kod, rootViewController kullanılabilir olmadığında açıkça çökecektir, bu açık uçtur. Ayrıca genellikle UI iş parçacığı kullanarak gerekli anahtarı içermez

dispatch_sync(dispatch_get_main_queue(), {
    guard !NSBundle.mainBundle().bundlePath.hasSuffix(".appex") else {
       return; // skip operation when embedded to App Extension
    }

    if let delegate = UIApplication.sharedApplication().delegate {
        delegate.window!!.rootViewController?.presentViewController(viewController, animated: true, completion: { () -> Void in
            // optional completion code
        })
    }
}

BTW bu yöntemi NEREDEN anlarım ... anlamak için aksi halde UI'sız SDK kütüphanesi, belirli (açıklanmayan) durumlarda uygulamanız üzerinde kendi kullanıcı arayüzünü görüntüler.
igraczech

Eğer birisi sdk uzantısına sahip bir uygulamada gömmeye karar verirse çökecek ve yakacak. Sdk init yöntemini [s] kötüye kullanmak için bir UIViewController geçirin.
Anton Tropashko

Sen gerçek Anton. Bu kod, Uzantılar mevcut olmadığında ve henüz hiçbirinde SDK kullanılmadığında yazılmıştır. Bu uç durumu atlamak için bir koruma maddesi ekledim.
igraczech

3

Uyarı Bu tür Sen şimdiki yeni çalışıyoruz anlamına gelebilir View Controllerthrough Navigation Controllerbu süre Navigation Controllerşu anda başka sunuyor View Controller. Düzeltmek için View Controllerİlk başta sunulan reddetme ve tamamlandığında yenisini sunmak zorundasınız . Uyarının başka bir nedeni View Controller, iş parçacığından başka bir şeyde gösterilmeye çalışmak olabilir main.


3

Swift 4.2 ile ilgili benzer bir sorunum vardı, ancak görüşüm görünüm döngüsünde sunulmadı. Aynı anda sunulacak birden fazla segue olduğunu fark ettim. Bu yüzden dispatchAsyncAfter kullandım.

func updateView() {

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in

// for programmatically presenting view controller 
// present(viewController, animated: true, completion: nil)

//For Story board segue. you will also have to setup prepare segue for this to work. 
 self?.performSegue(withIdentifier: "Identifier", sender: nil)
  }
}

2

Tamamlama bloğu start()içindeki işlevi taşıyarak düzelttim dismiss:

self.tabBarController.dismiss(animated: false) {
  self.start()
}

Başlangıç self.present()bir UINavigationController için diğeri için bir UINavigationController için iki çağrı içerirUIImagePickerController .

Bu benim için sorunumu çözdü.


1

Bu uyarıyı, bir kaba gömülü bir görünüm denetleyicisinden bir segue gerçekleştirirken de alabilirsiniz. Doğru çözüm, kabın ana denetleyicisinden segue kullanmaktır, kabın görünüm denetleyicisinden değil.


1

Aşağıdaki satırı yazmak zorunda.

self.searchController.definesPresentationContext = true

onun yerine

self.definesPresentationContext = true

UIViewController içinde


1

Swift 3 ile ...

Bana olan bunun bir başka olası nedeni, bir tableViewCell'den Storyboard'daki başka bir ViewController'a bir segue olmasıydı. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {}Hücre tıklandığında da kullandım .

ViewController ViewController bir segue yaparak bu sorunu giderdi.


1

Bu sorun vardı ve kök neden bir düğme tıklama işleyicisi (TouchUpInside) birden çok kez abone oldu.

Başka bir denetleyiciye gitmek için navigasyon eklediğimizden ve daha sonra tekrar gevşediğimizden beri birçok kez çağrılan ViewWillAppear'a abone oluyordu.


1

Film şeridindeki segue'in bir çeşit kırık olduğu bana geldi . Segue'in silinmesi (ve tam olarak aynı seguein tekrar oluşturulması) sorunu çözdü.


1

Ana pencerenizde, her zaman bir uyarı sunmakla uyumsuz geçişlerin olduğu zamanlar olacaktır. Uygulama yaşam döngünüzde herhangi bir zamanda uyarı sunmaya izin vermek için, işi yapmak için ayrı bir pencereniz olmalıdır.

/// independant window for alerts
@interface AlertWindow: UIWindow

+ (void)presentAlertWithTitle:(NSString *)title message:(NSString *)message;

@end

@implementation AlertWindow

+ (AlertWindow *)sharedInstance
{
    static AlertWindow *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[AlertWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
    });
    return sharedInstance;
}

+ (void)presentAlertWithTitle:(NSString *)title message:(NSString *)message
{
    // Using a separate window to solve "Warning: Attempt to present <UIAlertController> on <UIViewController> whose view is not in the window hierarchy!"
    UIWindow *shared = AlertWindow.sharedInstance;
    shared.userInteractionEnabled = YES;
    UIViewController *root = shared.rootViewController;
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    alert.modalInPopover = true;
    [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
        shared.userInteractionEnabled = NO;
        [root dismissViewControllerAnimated:YES completion:nil];
    }]];
    [root presentViewController:alert animated:YES completion:nil];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    self.userInteractionEnabled = NO;
    self.windowLevel = CGFLOAT_MAX;
    self.backgroundColor = UIColor.clearColor;
    self.hidden = NO;
    self.rootViewController = UIViewController.new;

    [NSNotificationCenter.defaultCenter addObserver:self
                                           selector:@selector(bringWindowToTop:)
                                               name:UIWindowDidBecomeVisibleNotification
                                             object:nil];

    return self;
}

/// Bring AlertWindow to top when another window is being shown.
- (void)bringWindowToTop:(NSNotification *)notification {
    if (![notification.object isKindOfClass:[AlertWindow class]]) {
        self.hidden = YES;
        self.hidden = NO;
    }
}

@end

Tasarımla her zaman başarılı olacak temel kullanım:

[AlertWindow presentAlertWithTitle:@"My title" message:@"My message"];

1

Ne yazık ki, kabul edilen çözüm benim durumumda işe yaramadı. Başka bir View Controller'dan gevşedikten hemen sonra yeni bir View Controller'a gitmeye çalışıyordum.

Hangi gevşeme segue'in çağrıldığını belirtmek için bir bayrak kullanarak bir çözüm buldum.

@IBAction func unwindFromAuthenticationWithSegue(segue: UIStoryboardSegue) {
    self.shouldSegueToMainTabBar = true
}

@IBAction func unwindFromForgetPasswordWithSegue(segue: UIStoryboardSegue) {
    self.shouldSegueToLogin = true
}

Sonra istenen VC'yi present(_ viewControllerToPresent: UIViewController)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if self.shouldSegueToMainTabBar {
        let mainTabBarController = storyboard.instantiateViewController(withIdentifier: "mainTabBarVC") as! MainTabBarController
        self.present(mainTabBarController, animated: true)
        self.shouldSegueToMainTabBar = false
    }
    if self.shouldSegueToLogin {
        let loginController = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LogInViewController
        self.present(loginController, animated: true)
        self.shouldSegueToLogin = false
    }
}

Temel olarak, yukarıdaki kod, giriş / Kaydolma VC'sinden çözülmeyi yakalamama ve gösterge tablosuna gitmeme veya VC şifresini unut ve giriş sayfasına gitmeme izin verme eylemine izin verecektir.


1

Ben en çok viewcontroller süre içinde rootViewController döngüsü sırasında bulunan sabit içine depolayarak bu hatayı düzeltti:

if var topController = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }
    topController.present(controller, animated: false, completion: nil)
    // topController should now be your topmost view controller
}

1

Bu hatayı Xcode'u güncelledikten sonra buldum, Swift 5'e inanıyorum . Sorun, bir görünüm denetleyicisini çözdükten sonra doğrudan bir segue başlattığımda oluyordu.

Çözüm, ilgili bir hatayı düzeltirken geldi, bu da kullanıcının artık sayfayı aşağı kaydırarak segileri gevşetebildiğidir. Bu benim programımın mantığını bozdu.

Bu tüm görünüm denetleyicileri üzerinde Sunum modunu değiştirerek giderilmiştir Otomatik için Tam Ekran .

Bunu arayüz oluşturucudaki özellikler panelinde yapabilirsiniz. Veya programlı olarak nasıl yapacağınıza ilişkin bu cevaba bakınız .


0

Ben de sadece bu sorunu vardı, ama zamanlama ile ilgisi yoktu. Sahneleri işlemek için bir singleton kullanıyordum ve bunu sunum yapan kişi olarak ayarladım. Başka bir deyişle, "Ben" hiçbir şeye bağlı değildi. Ben sadece onun iç "sahne" yeni sunucu ve voila yaptı, işe yaradı. (Anlamını öğrendikten sonra Voila dokunuşunu kaybeder, heh).

Yani evet, "sihirli bir şekilde doğru yolu bulmak" değil, kodunuzun nerede durduğunu ve ne yaptığını anlamakla ilgili. Apple, duygularıyla bile böyle basit bir uyarı mesajı verdiğine sevindim. Bunu yapan elma dev için Kudos !!


0

Diğer çözümler herhangi bir nedenden dolayı iyi görünmüyorsa, yine de bu iyi eski workaroundsunumunu 0 gecikmesi ile kullanabilirsiniz , örneğin:

dispatch_after(0, dispatch_get_main_queue(), ^{
    finishViewController *finished = [self.storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];
    [self presentViewController:finished animated:NO completion:NULL];    
});

VC'nizin, dağıtım bloğunun yürütülmesi planlanan zaman görünüm hiyerarşisinde olacağına dair herhangi bir belgelenmiş garanti görmemiş olsam da, bunun iyi çalışacağını gözlemledim.

Örneğin 0,2 sn'lik bir gecikmenin kullanılması da bir seçenektir. Ve en iyi şey - bu şekilde boolean değişkeniyle uğraşmanıza gerek yokviewDidAppear:


2
Bu şimdi işe yarar olsa da, Apple'ın davranışı değiştireceğine ve ileride bunu bozacağına dair bir garanti yoktur. Sonra tekrar bir şeyler düzeltmek ve düzeltmek için kodunuza bakmak için geri döndüğünüzde, neden bu gereksiz gereksiz gönderme yaptığınızı merak edeceksiniz.
Cruinh

0 zamanıyla gönderim yapmak beni birkaç kez kurtardı - bazen mantıklı çalışması gereken şeyler normalde onsuz çalışmaz. Öyleyse sadece kendiniz ve başkaları için neden açık olmayan şeyler yaptığınıza (sadece böyle bir sevkıyat değil) yorum yapın ve iyi olmalısınız.
Dannie P

2
Sadece problemi çözüyorsunuz ve çözmüyorsunuz.
Michael Peterson

0

Bu, gezinme denetleyiciniz varsa herhangi bir görünüm denetleyicisini sunmak için çalışır. self.navigationController? .present (MyViewController, animated: true, completion: nil) Ayrıca, uyarıları ve posta denetleyicisini de sunabilirim.

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.