2014-05-25 160 views
2

我有一個包含一個子控制器B的容器的主控制器A,我需要從控制器B調用控制器A中的一個方法,這就是我做我的父控制器從B:從子控制器調用父控制器的方法

MainController = (WatchedViewTableViewController*)self.parentViewController.childViewControllers[1]; 

它工作得很好的開始,但因爲我的應用程序可以讓其它標籤訪問此視圖控制器,以及,當它達到一定的層次結構這一觀點從其他選項卡控制器,它導致索引錯誤MainController

由於應用程序允許其他選項卡也重定向到此視圖控制器,self.tabBarController.selectedViewController也不起作用。

什麼應該是實現它的正確方法?謝謝。

+0

你應該代表工作 – EridB

回答

0

聽起來像是你需要代表團 這裏有一些鏈接:

總的想法是,你定義一個協議。然後,在父控制器中實現該協議。那麼您的孩子控制器引用父控制器協議的一個實例:

@protocol CustomMethodDelegate 
    -(void)doSomething 
@end 

讓孩子控制器包含協議的參考父視圖控制器:

@interface ChildViewController:UIViewController 
    @property (strong, nonatomic) id<CustomMethodDelegate> delegate; 
@end 

然後有您的父母控制器實現它:

@interface ParentViewController:UIViewController<CustomMethodDelegate> 
@end 

在父控制器實現DoSomething的: 當你將它作爲一個孩子爭奪讀寫控制,孩子的委託設置爲父控制器

@implementation ParentViewController 
    -(void)creatingChildViewController { 
     ChildViewController *controller = [self getNewChildViewController]; 
     controller.delegate = self; 
    } 

#pragma mark - CustomMethodDelegate 

    -(void)doSomething { 
     NSLog(@"Something"); 
    } 

@end 

,然後在子視圖控制器,你可以叫:

[self.delegate doSomething]; 

這將調用父控制器中的doSomething方法。

+0

非常明確和GD工作,THX :) – user3402639

0

這取決於您的用例,但子控制器可能不應直接調用父控制器上的方法。看起來也許你的孩子控制器應該定義一個協議,它的任何可能的父控制器都可以實現。

0

它是非常簡單的使用關鍵字super和其後的方法名稱 默認的例子是

[super viewDidDisappear:YES]; 

[super viewDidLoad]; 

你這是怎麼從子類中調用父類的方法

4

At ParentViewController.h

-(void)PlayMusic; 

ParentViewController.m

-(IBAction)PlayMusic:(id)sender { 
     [self playMusic]; 
} 

在子視圖控制器上的播放按鈕IBAction做到這一點:

-(IBAction)PlayMusic:(id)sender { 
     ParentViewController *parent = (ParentViewController*) self.parentViewController; 
     [parent playMusic]; 
} 
相關問題