2017-07-19 37 views
0

我的故事板有一个viewController NEWvc。它需要在viewController OLDvc中调用一堆方法。如何将故事板按钮连接到不同视图中的方法控制器

最初,我在NEWvc上添加了OLDvc作为属性,并在NEWvc上创建了可以调用OLDvc上的选择器的方法。必须有一种更好的方式将我的故事板中的按钮直接链接到OLDvc。

我可以添加一个对象,并将其转换为OLDvc的一个实例,但我需要它是已经存在的实例,而不是一个新的实例。我需要参考OLDvc的实例。

我该怎么做?

回答

0

可以定义与该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。

+0

这正是我最初做的。 “最初,我将OldVC添加为NewVC的属性,并在NewVC上创建了可以调用OldVC上的选择器的方法。”我在问有没有更好的方法将按钮直接链接到OldVC方法,例如将它作为参考添加到故事板中? – Bob

+0

这样我就不必为每个已经存在的OldVC方法在每个VC上定义新的方法。 – Bob

+0

@Bob这种方法究竟错了什么?您不依赖于您的OldVC类的具体实例,这意味着您在进行测试时可以轻松地将myDelegate替换为模拟控制器。如果您直接将按钮链接到OldVC(根据我所知无法完成),则会产生不必要的耦合,从长远来看,这会使代码支持和重构变得更加困难。 –

-1

首先,我想告诉,命名一个ViewController为NEWvc不遵循任何苹果编码标准。是可以是NewVC为更好的可读性。

使他们成为您想从另一个ViewController调用的类方法。

然后调用使用的类名

创建类方法

Replace - with + prefix to your methods 

例呼叫

[ClassName yourMethod]; 
+0

但他们需要使用OldVC的现有实例。为什么我会让他们成为类的方法? – Bob

+0

这是现有的实例..但你把它作为'类方法 – Saranjith

相关问题