這是棘手的詞,但我有一個視圖控制器(vc1),其中包含一個容器視圖(我正在使用故事板)。在該容器視圖內是一個導航控制器和一個根視圖控制器(vc2)。從容器視圖中的視圖控制器中,如何訪問包含容器的視圖控制器?
從vc2中我怎樣才能訪問vc1?
或者,我如何將vc1傳遞給vc2? (記住我正在使用故事板)。
這是棘手的詞,但我有一個視圖控制器(vc1),其中包含一個容器視圖(我正在使用故事板)。在該容器視圖內是一個導航控制器和一個根視圖控制器(vc2)。從容器視圖中的視圖控制器中,如何訪問包含容器的視圖控制器?
從vc2中我怎樣才能訪問vc1?
或者,我如何將vc1傳遞給vc2? (記住我正在使用故事板)。
您可以使用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;
}
}
編輯:小的代碼修復
謝謝邦尼告訴我該怎麼做。事實上,準備賽格方法是一條路。
我只是澄清代碼和步驟在這裏。
因此,首先命名故事板中將容器視圖連接到其第一個視圖控制器的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裏面會稍微不同。
要從孩子視圖控制器中訪問父視圖控制器,你必須覆蓋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]以相反的方式移除 中的子項。
上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;
}
}
您可以使用邦尼使用相同的方法委派。這裏是你如何做到這一點:
在你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
}
}
使用屬性parentViewController
爲self.parentViewController
在我的情況下,這不起作用self.parentViewController是零。我在故事板中添加了containerView,然後將相關的視圖控制器類設置爲我的特定子類。我期望parentViewController被設置爲包含容器視圖的VC,但這不會自動設置。我不得不使用上面的-prepareForSegue解決方案 –
屬性是「自我」。父母「在迅速3 –
@Firula行'的UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController];'不會初始化任何東西,只有指向已經存在的指針初始化控制器。 – Bonnie
因此,首先命名故事板中將容器視圖連接到其第一個視圖控制器的segue(鏈接)。我將它命名爲「toContainer」。 然後在含有容器視圖中添加本方法的視圖控制器 - (無效)prepareForSegue:(UIStoryboardSegue *)賽格瑞發件人:(ID)發送方 { 如果([segue.identifier isEqualToString:@ 「toContainer」]) UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController]; UIViewController * vc2 = [navViewController viewControllers] [0]; } } vc2是我想要參考的控制器。 –
注意:destinationViewController已經是我的容器嵌入目標UIViewController – BananaAcid