2010-03-14 21 views
5

Geçerli görünüm denetleyicisi işten çıkarıldığında (ya attı veya yoksayıldıModalDialog'd) genel bir en iyi uygulama yöntemi var mı? -viewWillDisappear kullanamıyorum :, bu, aynı zamanda başka bir viewController geçerli olanın üstüne itildiğinde çağrılır.Yöntem çağrıldı?

+8

Not: gözlemci değeri olarak

i containerView artık var olduğunda gözlem kaldırmak zorunda 'ya da' viewDidDisappear: ' . Ancak, iOS'un önceki sürümlerini desteklemeniz gerektiğinde bu yardımcı olmaz. –

+0

@ KristopherJohnson'un cevabı, şu anda iOS 4'ün hemen hemen hiç bulunmadığı doğru yanıt olarak işaretlenmelidir. –

cevap

11
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     [self addObserver:self forKeyPath:@"parentViewController" options:0 context:NULL]; 
    } 
    return self; 
} 


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([@"parentViewController" isEqualToString:keyPath] && object == self) { 
     if (!self.parentViewController) 
      NSLog(@"Dismissed"); 
    } 
} 

- (void)dealloc 
{ 
    [self removeObserver:self forKeyPath:@"parentViewController"]; 
    [super dealloc]; 
} 
+0

+1. KVO'nun ilginç kullanımı. – kennytm

+0

zeki, bunu sevdim! –

+0

Bu, ebeveynlerinden birinin görevden alınması sonucunda denetleyicinin "işten çıkarılması" durumunda beklediğiniz gibi çalışmayabilir. Bu durumda, parentViewController unset olmayacak, ancak diyalog artık görünmeyecek. Gerçekten, "işten atılmış" daha iyi tanımlanmalıdır. –

0

Bildiğim kadarıyla, bildirimde bulunmanın otomatik bir yolu yoktur, ancak UIViewController bir modalViewController özelliğine sahip olduğundan, "didDismiss ..." gibi bir tanım tanımlayabilir ve bu yöntemi önceki model görünüm denetleyicisinde arayarak yeni model görünümü denetleyicisi.

+0

Elbette, ancak bu standart olmayan, modal olmayan denetleyiciler için hiçbir şey yapmıyor ve kırılgan (ebeveynin bunu çağırmasını gerektirir). Bunun etrafında yollar olduğunu biliyorum, sadece orada 'kabul etmek' için kabul edilen bir 'en iyi yol' varsa merak ediyorum. –

0

Soruyu açıklayabilir misiniz?

Sana soruyorsunuz düşünüyorum:

ViewcontrollerONE modally ViewControllerTWO açılır. ViewControllerTWO işten atıldı. ViewControllerONE, bu ViewControllerTWO'nun kendisini reddettiğini ve bunun nedeni XYZ yöntemini çalıştırmak istediğini bilmek istiyor.

Ben iyi cevabım yok, ama bir yolunu var:

VC1 basitçe VC2 başvurulmaktadır. Bu nedenle VC2 işten çıkarmadan önce VC1'e bildirimde bulunabilir.

+1

Hayır, ViewControllerTWO, BT'nin reddedildiğini bilmek istiyor. –

0

KVO

şöyle ben UIViewController subclassed iOS 8. benim için işe yaramadı ve sonra sadece dismissViewControllerAnimated:completion: yerine sunulan görünüm denetleyicisinde dismissAnimated:completion: çağrı kullanılarak seçilen cevap. Başka bir yerde bildirimi gözlemlemek için kayıt yapıyorum ve gerektiğinde işlemeyi tetikliyorum. Elma sunum presentationControllers KVO compilant olmadıklarından, bunlar, presentationControllers kullanan iOS8 içinde nasıl çalıştığını değişti

#define DismissNotifyViewControllerDismissedNotification @"DismissNotifyViewControllerDismissed" 


@interface DismissNotifyViewController : UIViewController 

- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion; 

@end 


@implementation DismissNotifyViewController 

- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion 
{ 
    [self.presentingViewController dismissViewControllerAnimated: flag 
                 completion: ^{ 

      if (completion) 
       completion(); 

      [NSNotificationCenter.defaultCenter 
        postNotificationName: DismissNotifyViewControllerDismissedNotification 
        object: self]; 
    }]; 
} 

@end 
0

i -[UIPresentationController transitionDidFinish:] çağrıldığında o removedFromSuperview ve nilled çünkü containerView kullanmak zorunda kaldı. iOS8 için ve yukarıdaki Çözüm: sunum bazen özellikle zaten sunulması viewController sunarken başarısız olabilir çünkü gözlemci ekliyorum

self.presentationContext.presentViewController(self.viewControllerToPresent, animated: true, completion: { _ in 
    self.viewControllerToPresent.presentationController?.addObserver(self, forKeyPath: "containerView", options: [], context: &self.observingContext) 
}) 

completionHandler olduğunu. IOS 5 viewWillDisappear `içinde adı usul` -isBeingDismissed` sağladığını

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    guard &self.observingContext == context else { 
     super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
     return 
    } 
    if let presentationController = object as? UIPresentationController where presentationController.containerView == nil { 
     presentationController.removeObserver(self, forKeyPath: "containerView") 
    } 
}