我正在制作我的第一个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,所以我知道我可以进入该功能。
答案 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。
我的建议是让您找出上述方法之一,以正确解决两个控制器之间的通信问题。这是一个普遍的问题,你必须在编程项目中反复解决它。如果您选择了一个并希望获得更多细节,请直接询问。