2011-07-18 31 views
17

Bir ViewController modally sunumu yapıyorum. Ebeveyn denetleyicisine nasıl erişebilirim?Access modal denetim denetleyicisi ana

Mimarim tabBarController => VC1 => VC2 => VC3 => MVC1 ve MVC1'den VC3'e ulaşmak istiyorum. Hep daha geriye gidebilir

- (void) sendRequest { 
    NSLog(@"classe : %@",[[self parentViewController] class]); 
} 

ama benim TabBarViewController döner ...

cevap

21

Böyle bir şey hakkında gideceğim yol sadece bir temsilci oluşturmaktır. AskPasswordViewController 'ın başlığında,

id delegate; 

ve

@property (nonatomic, assign) id delegate; 

uygulama dosyasında sentezle koydu. Sonra, modal denetleyiciyi atadıktan/başlattıktan sonra ve sunmadan önce, modalViewController.delegate = self;'u ayarlayın. Sonra modal denetleyicide, görüntüleyen denetleyiciden bilgi almak için self.delegate numaralı telefonu arayabilirsiniz.

self.presentingViewController 

elma belgelerine gereğince: Bu çağırarak üst erişebilirsiniz

+0

Teşekkürler. Sonunda yaptıklarım buydu. Ama ana görüntüleme denetleyicisinin neden tabut olduğunu anlamak isterim. Gerçekten garip görünüyor ve bir yerlerde yanlış bir şeyler yapmaktan korkuyorum. –

+1

Neden olduğundan emin değilim, ama benim teorim, modal bir görünüm sunduğunuzdan, mutlaka onu sunan bir görünüm denetleyicisinin çocuğu değil, bunun bir parçası. Bu nedenle, ebeveyni, onu bir uzantı olarak sunan görüşün ebeveyni. Görünüşe göre bu yönüyle farklı bir davranışa sahip gibi görünmekle beraber, bir navigasyon denetleyicisi – justin

+0

aracılığıyla benim için de çalıştı. Ama "parentviewcontroller" sınıfının temsilcisini yapmak zorunda kaldım. "Üst görüntüleme denetleyicisinin" uitab çubuğuna erişmek istedim. – Chrizzz

5

:

- (void) editAd{ 
    AskPasswordViewController *modalViewController = [[AskPasswordViewController alloc] initWithNibName:@"AskPasswordView" bundle:nil]; 

    NSLog(@"modalparent class=%@", [[modalViewController parentViewController] class]); 

    [self presentModalViewController:modalViewController animated:YES]; 
    [modalViewController release]; 
} 

ben MVC1 bu çalıştı: VC3 olarak

, bu kod var sadece parentViewController'ı şu şekilde arayarak:

self.parentViewController.parentViewController .... ve Doğru olana ulaşın.

+0

Rahatsız edici viewController'ı sunan bazı denetleyicileri iten navigationController'ı sunan bir tabbarım var. –

+0

Sorunuzda bize geri besleme gibi bize bir modalviewcontroller archtecture vc1 -> vc2 -> nvc -> tbvc ve bize nerede almak istediğiniz yerden söyleyin. – Cyprian

+2

Acctual sınıf adını yazdırmak için şunu kullanın: 'NSLog (@" clase:% @ ", NSStringFromClass [[self parentViewController] sınıfı]));' – Cyprian

75

yardımcı olur (. Veya en uzak atası)

bu görünüm denetleyicisi sunulan görünümü kontrolörü

+4

Diğer yorumlar doğru zamanda yapılmış olsa da, bence bu, storyboard'larla (özellikle iOS 7'den beri) gitmek için bir yol olduğunu düşünüyorum. – Robin

+5

Sadece bir FYI bu viewDidLoad içinde sıfır olacak – user3344977

0
//You have to get the root, iterate through the root's ViewControllers and then ask for the ParentViewController. 
    UINavigationController ​*root = (UINavigationController*​)[[(AppDelegate*) [[UIApplication sharedApplication]delegate] window] rootViewController]; 
      for (UIViewController *VC in root.viewControllers) { 
       if([VC isKindOfClass:[YourParentViewController class]]){ 
        YourParentViewController* parent = (YourParentViewController*)VC; 
        [parent callMethod]; // your code here 
        [self dismissViewControllerAnimated:YES completion:nil]; 
       } 
      } 
1

Burada universa ile geldim Herhangi bir yerden root'a gitmek için l yöntemi.

{ 
    ... 
    SharedControllers.navigateToRoot(self) 
    ... 
} 
: her yerde projenizde gelen

import UIKit 

class SharedControllers 
{ 
    static func navigateToRoot(viewController: UIViewController) 
    { 
     var nc = viewController.navigationController 

     // If this is a normal view with NavigationController, then we just pop to root. 
     if nc != nil 
     { 
      nc?.popToRootViewControllerAnimated(true) 
      return 
     } 

     // Most likely we are in Modal view, so we will need to search for a view with NavigationController. 
     let vc = viewController.presentingViewController 

     if nc == nil 
     { 
      nc = viewController.presentingViewController?.navigationController 
     } 

     if nc == nil 
     { 
      nc = viewController.parentViewController?.navigationController 
     } 

     if vc is UINavigationController && nc == nil 
     { 
      nc = vc as? UINavigationController 
     } 

     if nc != nil 
     { 
      viewController.dismissViewControllerAnimated(false, completion: 
       { 
        nc?.popToRootViewControllerAnimated(true) 
      }) 
     } 
    } 
} 
  • Kullanımı: her yerde projenizde erişilebilir olacak şekilde

    1. Sen, bu sınıfın yeni bir sınıf dosyası oluşturmak

  • 1

    Ekleme Vibhor Goyal - Bazen, self.presentingViewController NavigationControlle olarak kaydeder r. Bu nedenle aşağıdaki adımları deneyin:

    if let vc = self.presentingViewController.childViewControllers.last as? YourViewController { 
    // do stuff here 
    }