iOS - 对调用者viewController的引用

时间:2012-10-06 19:43:11

标签: iphone ios cocoa-touch ipad

我在一个viewController中,我们称之为vcA,然后使用

调用第二个vcB
[self presentModalViewController:vcB animated:YES];

加载vcB后有没有办法获得对vcA的引用?

是的,我知道我可以继承vcB并为其添加属性。我只是问是否有一些原生的iOS方法/属性/已经做过的任何东西。

我在导航控制器应用程序上。

感谢。

3 个答案:

答案 0 :(得分:5)

如果单一火力使用并且没有很多合作,我倾向于选择阻止而不是授权,因为它看起来有点整洁。

例如,如果只是在完成使用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();
  }
}

如果需要返回值,则只需修改块以接受参数

答案 1 :(得分:2)

如果您的部署目标是iOS 5或更高版本,那么presentingViewController属性可能会为您提供所需的内容。

如果您的部署目标是iOS 4,您可能会从parentViewController属性中获得所需内容。

否则,您需要定义自己的属性。

答案 2 :(得分:1)

我建议使用委托。您在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的delgate。

// 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];
}

请注意,此模式可用于各种目的,而不仅仅是解除模态视图。