2

我确实找到了这个标题的答案,并且我做了一些研究,但我仍然没有得到流量。这是我想要发生的事情:

1)单击演示者视图上的按钮以打开模式视图。2)检索一些值并单击一个按钮以关闭模式视图....将值发送到演示者视图并执行一个方法。

我知道这就像一个回调,但我仍然无法弄清楚将回调的东西放在哪里。

那么,我该怎么做呢?A) 在 presentViewController 完成块中,我是否应该包含要在模态视图完成时执行的演示者视图方法?

或者:B)在模态视图的dismissViewControllerAnimated 完成块中,我是否应该包含要在模态视图完成时执行的演示者视图方法?

有人可以帮我一些示例代码吗?或者至少帮助我了解将代码放入哪个块的流程?

谢谢你,P

4

3 回答 3

9

您谈论完成块,所以我假设您不想使用委托。

在将以模态方式呈现的 viewController 中,您需要提供一个公共完成处理程序,该处理程序将在它被解除时调用。

@interface PresentedViewController : UIViewController

@property (nonatomic, strong) void (^onCompletion)(id result);

@end

然后在实现中,您需要在解雇时调用此完成块。在这里,我假设 viewController 在单击按钮时被关闭

- (IBAction)done:(id)sender
{
  if (self.onCompletion) {
    self.onCompletion(self.someRetrievedValue);
  }
}

现在回到显示模式的 viewController 中,您需要提供实际的完成块 - 通常在您创建 viewController 时

- (IBAction)showModal;
{
  PresentedViewController *controller = [[PresentedViewController alloc] init];
  controller.onCompletion = ^(id result) {
    [self doSomethingWithTheResult:result]
    [self dismissViewControllerAnimated:YES completion:nil];
  }
  [self presentViewController:controller animated:YES completion:nil];
}

这将创建新的 viewController 以模态方式呈现并定义完成时需要发生的事情。

于 2012-11-30T21:12:17.950 回答
2

您可以与代表一起执行此操作,这是 Apple 似乎推荐的方式,但这对我来说似乎有点矫枉过正。您可以使用 presentingViewController 属性引用演示者,因此您可以在按钮单击方法中从呈现的控制器设置演示者中的属性值:

self.presentingViewController.someProp = self.theValueToPass;
[self dismissViewControllerAnimated:YES];
于 2012-11-30T23:02:15.127 回答
1

使用委托是处理此问题的好方法:

在您的 PresentedViewController.h

@protocol PresentedViewControllerDelegate <NSObject>

-(void) viewWillDismiss;

@end

@property (nonatomic, weak) id <PresentedViewController> delegate;

然后在您的 PresentingViewController.h 中,您将订阅此委托

@interface PresentingViewController : UIViewController <PresentedViewControllerDelegate>

在 .m 中,您必须实现委托方法

- (void) viewWillDismiss {

}

并且在您呈现视图控制器之前,将您创建的委托属性设置为 self.

presentingViewController.delegate = self;

显然,这里并不是每个实现细节都已完成,但这应该可以帮助您入门。

于 2012-11-30T21:02:27.663 回答