gpt4 book ai didi

cocoa - 在构造函数中传递 Controller 总是不好的做法吗?

转载 作者:行者123 更新时间:2023-12-03 16:18:38 24 4
gpt4 key购买 nike

我偶尔会通过传入 View Controller 实例本身来实例化 View Controller 中的类,以便我创建的对象可以调用 Controller 的方法来更新 View 。

这总是、经常还是从来都不是一个坏习惯?

具体:

ViewController.h有

-(void)updateButtonValue:(NSString*)value;

MyObject.h 有

-(id)initWithViewController:(ViewController*)aViewController;

我从我的 View Controller 实例化该类:

[[MyObject alloc] initWithViewController:self];

从而允许 MyObject 实例通过简单的调用来更新我 View 中的按钮值,例如:

MyObject.m

[self.viewController updateButtonValue:@"example"];

这看起来并不理想,因为我传递给 MyObject 的内容( View Controller 本身)比它应该需要的多得多,但它确实是快速且实用的。如果有一种更简洁的方法,例如依赖协议(protocol),这也是简洁的,那么简短的代码示例将不胜感激。

最佳答案

传递类类型指针总是不好的做法,因为您将对象紧密耦合在一起(每个对象需要知道另一个对象的类,它们也可能是单个对象)。这就是委托(delegate)模式的用途。它最大限度地减少了 MyObject 所需的信息(最低限度,只不过是一个指针类型 id ,最好是由 MyObject 指定的协议(protocol)来为其提供一些行为保证)

所以要翻译你的例子

MyObject.h

替换...

-(id)initWithViewController:(ViewController*)aViewController;

与...

-(id) init; 

(如果您没有进一步的理由需要覆盖,则可以省略)

还有...

@property (nonatomic, weak) id delegate;

在 myViewController 中实例化(确实需要#include MyObject)...

MyObject* object = [[MyObject alloc] init];

随后

object.delegate = self;

(请注意,object 获取指向 myViewController 的指针,无需了解任何其他信息)

现在您可以从对象内部执行此操作:

 [self.delegate updateButtonValue:@"example"];

但是 ...您需要确保您的委托(delegate)可以接收消息updateButtonValue:

为此,您需要在 MyObject.h 中使用此方法的签名声明一个协议(protocol)

@protocol MyObjectDelegate

- (void) updateButtonValue:(NSString*)string;

@end

并在您的 viewController 中,在界面行中使用 <> 声明您遵守此协议(protocol)

@interface ViewController <MyObjectDelegate>

(这没什么大不了的,ViewController 已经必须 #include MyObject 来分配/初始化它,因此不需要更多信息来执行此操作)

并扩展您的属性(property)声明:

@property (nonatomic, weak) id <MyObjectDelegate> delegate

现在您已经为编译器提供了足够的信息,以确保您只能传递符合要求的消息。这里最棒的是,MyObject 可以放心地将消息传递给 MyViewController,除了通过委托(delegate)指针到达它之外,不需要了解有关 MyViewController 的任何信息。

关于cocoa - 在构造函数中传递 Controller 总是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14866979/

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