Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从另一个类函数调用一个类函数_Iphone_Xcode_Class_Function_Methods - Fatal编程技术网

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

Iphone 从另一个类函数调用一个类函数,iphone,xcode,class,function,methods,Iphone,Xcode,Class,Function,Methods,我正在制作我的第一个iPhone应用程序,并试图从另一个类函数访问一个类函数。为什么这不起作用 基本上我有两个类,“DateViewController”和“inputMilesViewController”。在“DateViewController”中,我从日期指针中获取一个日期,并将其转换为字符串,我希望将其发送到“inputMilesViewController”中的函数,该函数将更改该场景中按钮上的标签,以显示传入的字符串 在DateViewController.m中,我输入了#impo

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

*我无法获得传递的错误消息“选择器'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
。此解决方案确保两个类之间的耦合程度较低。 在中,您可以找到如何实现它的描述

编辑:

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


我的建议是让您制定出我上面描述的方法之一,以正确处理两个控制器之间的通信。这是一个非常普遍的问题,您必须在您的编程项目中反复解决它。如果你选择了一个,想知道更多的细节,就去问吧。

最好有一个简短的标题。另外,请不要使用签名等。在理解错误的含义之前,您需要了解类和对象之间的差异。谢谢大家的帮助。我尝试将“-(void)changebuttonext:(NSString*)dateStringForInput{”转换为“+(void)changebuttonext:(NSString*)dateStringForInput{”现在连接起来似乎没有问题。但是现在我发现自己遇到了这个问题-请参阅我的编辑。不幸的是,调用类方法不是解决方案。
@interface DateViewController
...
@property (nonatomic, retain/strong) inputMilesViewController* inputMilesController;
...
- (id)initWithInputMilesViewController:(inputMilesViewController*)controller;
...
@end

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