0

我正在制作我的第一个 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,这样我就知道我可以进入这个函数了。

4

1 回答 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,而是通过通知中心发送消息。该解决方案确保了两个类之间的较低耦合。在这篇文章中,您可以找到如何实现它的描述。

编辑:

调用类方法(+而不是-)不是解决方案,因为您想真正访问类实例,而不是类本身。类方法很好,例如,当您拥有类的所有实例共享的静态数据时。在这种情况下,您有一个控制器,它被实例化以备份屏幕上的某些视图;该视图中有一些按钮,您想更改其文本。这都是在实例级别固有地定义的。查看这篇文章,了解类和实例方法之间的区别

我的建议是让您找出我上面描述的方法之一来正确解决两个控制器之间的通信。这是一个如此普遍的问题,您将不得不在您的编程项目中一遍又一遍地解决它。如果您拿起一个并想了解更多详细信息,请索取。

于 2012-11-04T21:57:07.947 回答