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