请参阅以下编辑,了解当前(次要)问题
首先,我是这个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文件中调用此函数,反之亦然。 那我该怎么做? This,this和this问题有点回答,但对我来说并不适用。我会在一瞬间解释原因。
这是我尝试过并认为应该有效的方法:
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
*/
答案 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中的文件。这对于避免循环导入等很有用。