如何将故事板按钮连接到不同视图中的方法控制器
问题描述:
我的故事板有一个viewController NEWvc。它需要在viewController OLDvc中调用一堆方法。如何将故事板按钮连接到不同视图中的方法控制器
最初,我在NEWvc上添加了OLDvc作为属性,并在NEWvc上创建了可以调用OLDvc上的选择器的方法。必须有一种更好的方式将我的故事板中的按钮直接链接到OLDvc。
我可以添加一个对象,并将其转换为OLDvc的一个实例,但我需要它是已经存在的实例,而不是一个新的实例。我需要参考OLDvc的实例。
我该怎么做?
答
可以定义与该NEWVC将在调用方法的协议oldVC:
@protocol MyProtocol
- (void)doSomethingOnOldVC;
@end
然后你让你oldVC实现所需的方法:
@interface OldVC : UIViewControler <MyProtocol>
@end
@implementation OldVC
- (void)doSomethingOnOldVC
{
NSLog(@"Something happened.");
}
当你告诉你的NEWVC,你应该提供和oldVC的实例,并将其存储为一个弱性质:
@interface NewVC : UIViewController
@property (nonatomic, weak) id<MyProtocol> myDelegate;
@end
...
在oldVC:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NewVC *newVC = sender.destinationViewController;
newVC.myDelegate = self;
}
然后,您可以调用委托方法˚F从任何地方在newVC。
这正是我最初做的。 “最初,我将OldVC添加为NewVC的属性,并在NewVC上创建了可以调用OldVC上的选择器的方法。”我在问有没有更好的方法将按钮直接链接到OldVC方法,例如将它作为参考添加到故事板中? – Bob
这样我就不必为每个已经存在的OldVC方法在每个VC上定义新的方法。 – Bob
@Bob这种方法究竟错了什么?您不依赖于您的OldVC类的具体实例,这意味着您在进行测试时可以轻松地将myDelegate替换为模拟控制器。如果您直接将按钮链接到OldVC(根据我所知无法完成),则会产生不必要的耦合,从长远来看,这会使代码支持和重构变得更加困难。 –