Objective C - 从另一个类调用方法

4

我有两个类geoViewControllergeoMainViewController

geoMainViewController中有一个名为getFoo的方法

它看起来像这样:

- (NSString *)getFoo
{

NSString* foo = @"This is foo";

return foo;

}

我试图从geoViewController类调用getFoo方法。

在我的geoViewController m文件中,我有#import "geoMainViewController.h"

我正在尝试在geoViewController类的viewDidLoad中实例化geoMainViewController类并调用getFoo方法,代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];

    geoMainViewController* mainVC = [[geoMainViewController alloc] init];

    NSString* myFoo = [mainVC getFoo];    

}

似乎实例化了geoMainViewController类,但是在NSString* myFoo = [mainVC getFoo];处出现了错误。
错误提示为-“geoMainViewController”的可见@interface没有声明“getFoo”选择器。
我确信我漏掉了一步,因为我很新手Objective C。我只是不知道我做错了什么。
如果能提供任何帮助将不胜感激。
谢谢!
4个回答

6
在你的geoMainViewController.h文件中,你应该声明选择器可见:
-(NSString *)getFoo;

2
然而,这里还有更加阴险的事情;OP似乎不明白,你不能只是创建一个视图控制器的实例,而不将其连接到视图层次结构中,仅仅为了调用单个方法。 - trojanfoe
1
同意。应该使用实例变量,而viewDidLoad方法不应该是初始化视图控制器的地方。 - erran
我在回答被问的问题。如果我必须用命名规范、MVC实践、正确的UIViewController实现等来包围我的问题,那么我建议重新开始整个iOS开发。 - graver
搞定了。谢谢。这显然只是一个测试,不是真正的代码。我只是在尝试熟悉Objective-C类。感谢您的帮助。 - Sequenzia
1
@graver,你对这个明显的错误没有任何评论吗? - trojanfoe
1
@trojanfoe,我已经了解了,但很明显@Sequenzia刚开始熟悉类、方法等,还有很长的路要走,包括UIViewControllers、它们的实现、层次结构、交互等。 - graver

1

你在头文件中声明了吗?

头文件包含了.h文件中的所有函数声明,你只需要在类中包含.h文件即可。因此这取决于.h文件。.h文件将会有与.m文件相同的所有函数。

希望能对你有所帮助。


1
你对于创建一个视图控制器,只是为了调用其中一个方法,没有任何意见吗? - trojanfoe

1
你是否在geoMainViewController.h中添加了- (NSString *)getFoo方法?你需要通过.h文件将这些方法暴露给对象的外部,以便其他对象知道它们响应的选择器。自动完成是否偶然填入了该消息?
#import <Foundation/Foundation.h>

@interface 
{

}

@property (nonatomic,strong) ;
@property (nonatomic,strong) ;
@property (nonatomic, strong) ;

- (NSString *)getFoo
@end

编辑:(顺便说一下,您也可以将Foo作为属性)


0
你对如何使用视图控制器存在误解。虽然你可以在必要时创建一个视图控制器的实例以调用其中的方法,但这并不是常规做法。通常情况下,视图控制器应该作为视图层次结构的一部分,只有当你能够访问到某个实例时才能在其上调用方法。你可能在这方面存在一些基本问题。
实际上,你的错误很可能是由于缺失方法声明造成的,但在解决此问题之前,你还有更大的问题需要解决。

感谢您的反馈。我理解您的意思,但我有一个完全相同的函数,我需要能够从两个不同的视图控制器中调用它。我试图避免重复代码。是否有更好的地方可以放置该函数?也许是应用程序委托?我的代码现在正在工作,但我想确保我遵循最佳实践。谢谢! - Sequenzia
@Sequenzia 这取决于方法的作用。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接