【问题标题】:Call one class function from another class function从另一个类函数调用一个类函数
【发布时间】:2012-11-04 21:41:30
【问题描述】:

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

【问题讨论】:

  • 最好有一个简短的标题。也请不要使用签名等。
  • 您需要先了解类和对象之间的区别,然后您才能理解错误的含义。

标签: iphone xcode class function methods


【解决方案1】:
   [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 的说明。

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

【讨论】:

  • 感谢大家的帮助。我尝试将“-(void)changeButtonText:(NSString*) dateStringForInput{”转换为“+(void)changeButtonText:(NSString*) dateStringForInput{”,现在它似乎可以毫无问题地连接起来。但是现在我发现自己遇到了这个问题 - stackoverflow.com/q/13223847/1798729
  • 请看我的编辑。不幸的是,调用类方法不是解决方案。
猜你喜欢
  • 2018-07-30
  • 1970-01-01
  • 2016-04-06
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多