从另一个类函数调用一个类函数

时间:2012-11-04 21:41:30

标签: iphone xcode class function methods

我正在制作我的第一个iPhone应用程序,并尝试从另一个类函数访问一个类函数。为什么这不起作用?

基本上我有两个类,“DateViewController”和“inputMilesViewController”。在“DateViewController”中,我从日期指针中取出一个日期并将其转换为字符串,我想将其发送到“inputMilesViewController”中的函数,该函数将更改该场景中按钮上的标签以显示传入的字符串。

在DateViewController.m中我输入了#import“inputMilesViewController.h” 我试着做了

[inputMilesViewController changeButtonText:msg];

*我无法通过错误消息“没有选择器的已知类方法'changeButtonText:'

inputMilesViewController.m具有以下内容......

-(void) changeButtonText:(NSString*) dateStringForInput{

 NSLog(@"we got to changebuttontext");
  //[_myTodayButton setTitle:dateStringForInput forState:UIControlStateNormal];
}

现在我不太关心实际更改文本而只是试图让它打印这个NSLog,所以我知道我可以进入该功能。

1 个答案:

答案 0 :(得分:2)

   [inputMilesViewController changeButtonText:msg];
     

*我无法通过错误消息“没有选择器的已知类方法'changeButtonText:'

您正在将消息发送到类而不是该类的实例。这解释了这个问题。

解决此问题的方法是让一个控制器了解另一个控制器,以便您可以将消息发送到已知的控制器实例。这可以通过一种称为“依赖注入”的技术来完成,简单来说,这意味着您将对inputMilesViewController实例的引用“注入”到另一个控制器中,以便后者可以向其发送消息前者。

例如,您可以将指向inputMilesViewController实例的指针传递给DateViewController的初始化方法。

@interface DateViewController
...
@property (nonatomic, retain/strong) inputMilesViewController* inputMilesController;
...
- (id)initWithInputMilesViewController:(inputMilesViewController*)controller;
...
@end

@implementation DateViewController
...
   [self.inputMilesController changeButtonText:msg];
...
@end

或者你可以简单地在DateViewController中定义一个属性并在正确的时间设置它的值(即,在调用dateStringForInput之前)。

在Objective-C中处理依赖注入的一种好方法是通过“delegate”或“dataSource”的概念。 (我希望这听起来对你来说很熟悉,所以你可以找到一个好的设计方法)。

另一种方法是使用通知中心,因此您不必直接向inputMilesViewController发送消息,而是通过通知中心发送消息。该解决方案确保了两个类之间的较低耦合。 在this post中,您可以找到有关如何实施它的说明。

编辑:

调用类方法(+而不是-)不能成为解决方案,因为您希望真正访问类实例,而不是类本身。如果您拥有例如所有实例的静态数据,则类方法很有用。在这种情况下,您有一个控制器,它被实例化以备份屏幕上的某些视图;该视图中有一些按钮,您想要更改其文本。这实际上是在实例级别定义的。 请查看此帖子,了解有关difference between class and instance methods

的说明

我的建议是让您找出上述方法之一,以正确解决两个控制器之间的通信问题。这是一个普遍的问题,你必须在编程项目中反复解决它。如果您选择了一个并希望获得更多细节,请直接询问。