我正在一个名为vcA的视图控制器中,现在我需要调用另外一个视图控制器vcB,使用以下代码:
[self presentModalViewController:vcB animated:YES];
一旦vcB被加载,有没有办法获取对vcA的引用?
是的,我知道我可以子类化vcB并向其中添加一个属性。我只是想知道是否有一些本地iOS方法/属性/其他已经做到了这一点。
我在一个导航控制器应用程序上。
谢谢。
我正在一个名为vcA的视图控制器中,现在我需要调用另外一个视图控制器vcB,使用以下代码:
[self presentModalViewController:vcB animated:YES];
如果只是单一的使用且没有太多的协作,我倾向于使用块而不是委托,因为它看起来更整洁。
例如,如果只是在使用secondViewController后回调,我会:
添加一个块属性到SecondViewController中
@property (nonatomic, strong) void (^onCompletion)(void);
然后,在第一个视图控制器中创建第二个视图控制器时,
- (void)showSecondViewController;
{
SecondViewController *viewController = [[SecondViewController alloc] init];
viewController.onCompletion = ^{
[self dismissViewControllerAnimated:YES completion:nil];
};
[self presentViewController:viewController
animated:YES
completion:nil];
}
然后,在 secondViewController 中完成后
- (IBAction)doneTapped;
{
if (self.onCompletion) {
self.onCompletion();
}
}
dismissViewControllerAnimated:completion:
并且self
指向当前对象(即firstViewController)来引用firstViewController。 - Paul.spresentingViewController
属性来实现您的需求。
如果您的部署目标是iOS 4,则可以从 parentViewController
属性中获取所需内容。
否则,您需要定义自己的属性。// ViewControllerB.h
@class ViewControllerB;
@protocol ViewControllerBDelegate <NSObject>
- (void)viewControllerDidClose:(ViewControllerB *)viewController;
@end
@property (unsafe_unretained, nonatomic) id<ViewControllerBDelegate> delegate;
// ViewControllerB.m
- (IBAction)closeButtonTapped:(id)sender
{
if ([self.delegate respondsToSelector:@selector(viewControllerDidClose:)]) {
[self.delegate viewControllerDidClose:self];
}
}
然后在vcA中实现该协议。
// ViewControllerA.h
@interface ViewControllerA : UIViewController <ViewControllerBDelegate>
将vcA设置为vcB的代理。
// ViewControllerA.m
- (void)presentVcB {
vcB = [[ViewControllerB alloc] initWithNibName:nil bundle:nil];
vcB.delegate = self;
[self presentModalViewController:vcB animated:YES];
}
当方法被调用时,相应地做出响应。
// Implementing ViewControllerBDelegate
- viewControllerDidClose:(ViewControllerB *)viewController {
[self dismissModalViewControllerAnimated:YES];
}