3

我在一个viewController中,我们称之为vcA,我称之为第二个vcB,使用

[self presentModalViewController:vcB animated:YES];

一旦加载了vcB,有没有办法获得对vcA的引用?

是的,我知道我可以继承 vcB 并向其添加属性。我只是在问是否有一些本机 iOS 方法/属性/已经这样做的任何东西。

我在一个 navigationController 应用程序上。

谢谢。

4

3 回答 3

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();
  }
}

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

于 2012-10-06T21:19:23.817 回答
2

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

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

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

于 2012-10-06T19:46:35.450 回答
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的委托。

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

请注意,此模式可用于多种目的,而不仅仅是关闭模式视图。

于 2012-10-06T20:30:03.857 回答