gpt4 book ai didi

iphone - 用 block 简化委托(delegate)方案——在这种情况下是否可能?

转载 作者:可可西里 更新时间:2023-11-01 05:14:29 25 4
gpt4 key购买 nike

我已经阅读了很多关于使用 block 的正面信息 - 特别是它通过消除委托(delegate)调用来简化代码。我找到了在动画结束时使用 block 而不是委托(delegate)调用的示例 - 我了解如何完成。

但我真的很想知道在呈现和关闭 View Controller 时必须使用委托(delegate)的繁琐方案是否也可以用 block 来简化。

显示和关闭方案的标准推荐方式如下所示,其中在 VC1 中呈现了一个新的 VC2,它在 VC1 中再次被代表关闭。

  VC2 *vc2 = [[VC2 alloc] initWithNibName:@"VC2" bundle:nil ];
vc2.delegate = self;
[self presentModalViewController: vc2 animated: YES]; // or however you present your VC2

用 VC2 返回到 vc1:

[self.delegate vc2HasFinished];

为此,必须创建如下协议(protocol):在 VC2Protocol.h 文件中

 @protocol VC2Protocol <NSObject>
-(void)vc2HasFinished;
@end

然后在 VC1 和 VC2 中包含这个 VC2Protocol.h。在 VC1 中,必须像这样定义此方法:

-(void) weitereRufNrVCDidFinish{
[self dismissModalViewControllerAnimated:YES completion: nil];

}

如果可以编写更简洁的代码,避免为此声明协议(protocol),那就太好了。

谢谢!

最佳答案

对于关闭模态呈现的 vc 的情况,请注意 vc 可以自行关闭。因此,您可以在 vc2 中说 [self dismissModalViewControllerAnimated:YES completion: nil]; 而不是 [self.delegate vc2HasFinished];

但我同意你的观点, block 很有用,委托(delegate)很笨拙(而且更容易出错,尤其是在 ARC 之前)。所以这里是你如何在 vc 中替换委托(delegate)回调。让我们发明一种情况,在这种情况下,vc 想要告诉它的委托(delegate),例如,它刚刚获取了一张图像......

// vc2.h
@property (nonatomic, copy) void (^whenYouFetchAnImage)(UIImage *);
// note, no delegate property here

// vc2.m
// with your other synthesizes
@synthesize whenYouFetchAnImage=_whenYouFetchAnImage;

// when the image is fetched
self.whenYouFetchAnImage(theFetchedImage);

呈现的 vc 没有设置委托(delegate),但它确实为新的 vc 提供了一些代码以在获取图像时运行(在它自己的执行上下文中)...

// presenting vc.m
VC2 *vc2 = [[VC2 alloc] initWithNibName:@"VC2" bundle:nil];

// say this presenting vc has an image view that will show the image fetched
// by vc2. (not totally plausible since this image view will probably be covered by vc2
// when the block is invoked)
vc2.whenYouFetchAnImage = ^(UIImage *image) { self.myImageView.image = image; };

关于iphone - 用 block 简化委托(delegate)方案——在这种情况下是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com