2012-11-04 145 views
0

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

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

在DateViewController.m我已经#进口“inputMilesViewController.h” 进入我试图做

*我不能获得通过的错误消息“没有已知的类方法的选择‘changeButtonText:’

inputMilesViewController.m具有以下...

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

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

现在我不太关心实际上改变文本,我只是想要打印这个NSLog,所以我知道我可以进入函数。

+0

最好有一个简短的标题。也请不要使用签名等。 –

+1

在错误的含义对你有意义之前,你需要理解类和对象之间的区别。 –

回答

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中处理依赖注入的好方法是通过“委托”或“数据源”的概念。 (我希望这一切听起来很熟悉,所以你可以找到一个好的设计方式)。

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

编辑:

调用类方法(+而不是-)不能是解决方案,因为你想真正进入类的实例,而不是类本身。一个类的方法是好的,当你有,例如,该类共享的静态数据即所有实例。在这种情况下,你有一个控制器被实例化来备份屏幕上的一些视图;该视图中有一些按钮,并且您想要更改其文本。这一切都是在实例级固有定义的。 看看这篇文章,了解有关difference between class and instance methods的说明。

我的建议是为您制定出上述方法之一,以正确解决两个控制器之间的通信问题。这是一个普遍的问题,您必须在整个编程项目中反复处理它。如果你拿起一个,并希望有更多的细节,只需要它。

+0

感谢大家的帮助。我试着将“ - (void)changeButtonText:(NSString *)dateStringForInput {”转换为“+(void)changeButtonText:(NSString *)dateStringForInput {”,现在它似乎没有问题。但现在我发现自己有这个问题 - http://stackoverflow.com/q/13223847/1798729 –

+0

请参阅我的编辑。不幸的是,调用类方法不是解决方案。 – sergio