我在一个viewController中,我们称之为vcA,我称之为第二个vcB,使用
[self presentModalViewController:vcB animated:YES];
一旦加载了vcB,有没有办法获得对vcA的引用?
是的,我知道我可以继承 vcB 并向其添加属性。我只是在问是否有一些本机 iOS 方法/属性/已经这样做的任何东西。
我在一个 navigationController 应用程序上。
谢谢。
我在一个viewController中,我们称之为vcA,我称之为第二个vcB,使用
[self presentModalViewController:vcB animated:YES];
一旦加载了vcB,有没有办法获得对vcA的引用?
是的,我知道我可以继承 vcB 并向其添加属性。我只是在问是否有一些本机 iOS 方法/属性/已经这样做的任何东西。
我在一个 navigationController 应用程序上。
谢谢。
如果它是单火使用并且没有很多协作,我倾向于使用块而不是委托,因为它看起来有点整洁。
例如,如果它只是在您使用完 secondViewController 后回调,我会:
向 SecondViewController 添加块属性
@property (nonatomic, strong) void (^onCompletion)(void);
然后在 firstViewController 时创建 secondViewController
- (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();
}
}
如果您需要返回值,则只需修改块以接受参数
如果您的部署目标是 iOS 5 或更高版本,那么该presentingViewController
属性可能会为您提供所需的内容。
如果您的部署目标是 iOS 4,您可能会从该parentViewController
属性中获得所需的内容。
否则,您需要定义自己的属性。
我建议使用委托。您在 vcB 上声明一个属性并将 vcA 设置为委托。这样,您可以将各种状态更改传达给呈现的 UIViewController。
首先进行协议声明并声明委托属性。
// 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];
}
请注意,此模式可用于多种目的,而不仅仅是关闭模式视图。