在MainViewController.m和FlipsideViewController.m之间调用方法

时间:2013-01-05 17:03:40

标签: iphone objective-c xcode methods user-defined-functions

请参阅以下编辑,了解当前(次要)问题


首先,我是这个Obj C的新手,来自javascript / PHP,我很难处理语法,所以请在这里找我。

现在几个小时,我一直在尝试调用方法(方法正确,不是函数?)“介于MainViewController.m和FlipsideViewController.m 之后 - - 从一个文件/类到另一个。

我想这通常被称为“来自另一个类的调用方法”。我知道,有很多这样的问题,但我无法让它正常工作。

就我而言,我在上述两个文件中都有几个用户定义的方法/功能。有时,我需要从位于MainViewController.m文件中的FlipsideViewController.m中调用一个方法

// in MainViewController.m

- (void) calculateDays {
    //executes caluculations
   // inserts data into labels, etc 
}

如果我想简单地从同一档案中调用此功能,我只会这样做:

[self calculateDays];

这很简单,但是,我想在FlipsideViewController.m文件中调用此函数,反之亦然。 那我该怎么做Thisthisthis问题有点回答,但对我来说并不适用。我会在一瞬间解释原因。

这是我尝试过并认为应该有效的方法:

MainViewController *mvs = [[MainViewController alloc] init]; //alloc init MVC
[mvs calculateDays]; //call "external" function

它给出了错误:“Unknown type name MainViewController”。所以我假设我必须以某种方式包含/导入它才能工作(就像在javascript或PHP中一样)。所以我将它包含在FlipSideViewController.m类中:

 #import "MainViewController.h"
到目前为止

很好没有错误。然后我尝试编译/构建它并遇到另一个错误: “clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)” “ld:3个用于架构armv7s的重复符号”

这个让我认为 导入MainViewController不是那种方式,因为我随后导入了许多其他可能会干扰某些代码的东西FlipSideViewController类。

尝试了类似的解决方案但似乎没有任何效果。任何人都可以向我解释我做错了什么,也许如何正确地做到这一点:在MainViewController.m和FlipsideViewController.m之间调用方法,反之亦然。


编辑!

H2CO3的提出的解决方案确实解决了大部分问题(XCode暂时漏洞并给我随机错误,这迫使我重建整个项目)但仍然有一件事没有非常有效:更改UILabel(UIOutlet)的内容。请看看你们中是否有人可以帮助我:

当从self中调用该方法时(即[self calculateDay]),该值成功插入到UILabel中。从 FlipsideViewController 调用时,要插入的值存在并成功处理,但无法插入到UILabel中。请在下面。

一些记录:

//method called from within self on viewDidLoad: [self calculateDay];
Processed value to update label with: 26
New value in outlet after having been inserted: 26


//method called from another (FlipsideViewController) class file: [mvs calculateDay];
Processed value to update label with: 26
New value in outlet after having been inserted: (null)

/* 
  This doesn't work either from that external file: 
  [[mvs LabelName] setText:@"Hello, update label!"]; no errors but no display either

*/

2 个答案:

答案 0 :(得分:2)

如果您改为导入标头,那么应该为您提供所有必要的声明,但您不会有“重复符号”链接器错误。这是编写(Objective-)C代码的“标准”/通用实践。

#import "MainViewController.h"
                            ^
      ".h" instead of ".m" -+

答案 1 :(得分:0)

(外行人的术语)在Objective-C中,您只能使用每个文件都知道的对象。在此示例中,您尝试在FlipsideController.m文件中使用MainViewController。 FlipsideController.m不知道MainViewController是什么,所以它会抛出错误,因为它不知道它是什么或如何使用它。您有两个选项可以告诉Flipsidecontroller MainViewController是什么,您可以导入标题(#import "MainViewController.h"),这将使您可以完全访问FlipSideController.h中定义的所有内容。 (你可能永远不会导入.m,除非你真的知道你在做什么)你也可以在.h中创建一个前向声明 - @class FilpsideController并导入.m中的文件。这对于避免循环导入等很有用。