2014-01-21 190 views

回答

49

您可以使用Vc1中的prepareForSegue方法,因爲當ContainerViewController成爲子對象時會發生嵌入延遲。您可以將自己作爲obj傳遞或存儲對孩子的引用以供以後使用。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSString * segueName = segue.identifier; 
    if ([segueName isEqualToString: @"embedseg"]) { 
     UINavigationController * navViewController = (UINavigationController *) [segue destinationViewController]; 
     Vc2 *detail=[navViewController viewControllers][0]; 
     Vc2.parentController=self; 
    } 
} 

編輯:小的代碼修復

+0

@Firula行'的UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController];'不會初始化任何東西,只有指向已經存在的指針初始化控制器。 – Bonnie

+1

因此,首先命名故事板中將容器視圖連接到其第一個視圖控制器的segue(鏈接)。我將它命名爲「toContainer」。 然後在含有容器視圖中添加本方法的視圖控制器 - (無效)prepareForSegue:(UIStoryboardSegue *)賽格瑞發件人:(ID)發送方 { 如果([segue.identifier isEqualToString:@ 「toContainer」]) UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController]; UIViewController * vc2 = [navViewController viewControllers] [0]; } } vc2是我想要參考的控制器。 –

+0

注意:destinationViewController已經是我的容器嵌入目標UIViewController – BananaAcid

2

謝謝邦尼告訴我該怎麼做。事實上,準備賽格方法是一條路。

我只是澄清代碼和步驟在這裏。

因此,首先命名故事板中將容器視圖連接到其第一個視圖控制器的segue(鏈接)。我將它命名爲「toContainer」。

然後在包含容器視圖的視圖控制器添加此方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString: @"toContainer"]) { 
     UINavigationController *navViewController = (UINavigationController *) [segue destinationViewController]; 
     UIViewController *vc2 = [navViewController viewControllers][0]; 
    } 
} 

所以VC2是我希望得到參考控制器。

這對我有效,如果你的第一個viewconroller不是導航控制器,你的方法在prepareForSegue裏面會稍微不同。

+3

您可以將我的答案標記爲正確,並在評論中添加您的更好的說明。 – Bonnie

+0

Mark,您需要將Firula's或Bonnie的答案標記爲正確,然後繼續編輯您的問題並在問題中提供這些有用的信息。 – Fattie

17

要從孩子視圖控制器中訪問父視圖控制器,你必須覆蓋didMoveToParentViewController

- (void)didMoveToParentViewController:(UIViewController *)parent { 
    [super didMoveToParentViewController:parent]; 

    //Use parent 
} 

在Xcode的命令+點擊了此方法的詳細信息:

這兩種方法在子控制器之間轉換時,容器子類是公用的。如果它們被覆蓋,覆蓋應該確保調用超級。 這兩個方法中的父參數是零,當一個孩子被從其父母移除;否則它等於新的父視圖控制器 。

addChildViewController:在添加 孩子之前將調用[child willMoveToParentViewController:self]。但是,它不會調用didMoveToParentViewController :.預計容器視圖 控制器子類將在轉換到新子項之後進行此調用,或者在調用addChildViewController後立即在不進行轉換的情況下進行調用。同樣, removeFromParentViewController:在刪除 子項之前,不會調用[self willMoveToParentViewController:nil]。這也是容器子類的責任。容器子類通常會定義 一種方法,該方法首先調用addChildViewController,然後執行一個 轉換,該轉換將新子視圖添加到其父視圖層次結構中,最後將調用 didMoveToParentViewController :.同樣,子類通常會定義一種方法,通過首先調用[child willMoveToParentViewController:nil]以相反的方式移除 中的子項。

1

上VC2 1)露出的屬性用於在引用傳遞到上VC1 VC1

//VC2.h 
#import "VC1.h" 

@interface VC2 : NSObject 
@property (strong, nonatomic) VC1 *parent; 
@end 

2),通過自成在prepareForSegue方法在VC2露出的屬性您設置您賽格瑞的標識符之後到「ToVC2」。然後通過參考如下:

//VC1.m 
@implementation VC1 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if([segue.identifier isEqualToString:@"ToVC2"]) { 
    VC2 *vc2 = segue.destinationViewController; 
    vc2.parent = self; 
} 
} 
8

您可以使用邦尼使用相同的方法委派。這裏是你如何做到這一點:

在你containerViews的ViewController:

class ContainerViewViewController: UIViewController { 
    //viewDidLoad and other methods 

    var delegate: ContainerViewControllerProtocol? 

    @IBAction func someButtonTouched(sender: AnyObject) { 
    self.delegate?.someDelegateMethod() //call this anywhere 
    } 

} 

protocol ContainerViewControllerProtocol { 
    func someDelegateMethod() 
} 

在你父母的ViewController:

class ParentViewController: UIViewController, ContainerViewControllerProtocol { 
    //viewDidLoad and other methods 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "filterEmbedSegue" { 
      let containerViewViewController = segue.destinationViewController as ContainerViewViewController 

      containerViewViewController.delegate = self 
     } 
    } 

    func someDelegateMethod() { 
     //do your thing 
    } 
} 
8

使用屬性parentViewControllerself.parentViewController

+7

在我的情況下,這不起作用self.parentViewController是零。我在故事板中添加了containerView,然後將相關的視圖控制器類設置爲我的特定子類。我期望parentViewController被設置爲包含容器視圖的VC,但這不會自動設置。我不得不使用上面的-prepareForSegue解決方案 –

+0

屬性是「自我」。父母「在迅速3 –

相關問題