Objective-C有像php的include_once调用吗?

时间:2011-12-20 01:28:09

标签: iphone objective-c

我已经浏览过几次斯坦福iOS课程,并了解他们使用的所有示例。我已经从Apple网站上阅读了很多文档和十几个例子,但是我错过了重用代码的策略 - 这应该是面向对象语言的一个特性。

我有一大堆代码在屏幕上放置了录制按钮和播放按钮。与按钮关联的代码仅用于显示。选择器处于开启按钮可处理录制,存储和播放。我想在屏幕上有三组这些按钮。在PHP中,我只将50行代码放在一个包含文件中,在javascript中我可能会编写一个函数来显示它们。在对象世界中,我不知道最好的方法是什么。

我是否会使用UIView类,如果是这样,我如何让视图显示在舞台上?我可以像我一样使用默认目标C类进行记分,但后来我对如何将按钮放到舞台上有同样的问题。

感谢您的评论,但#import指令与PHP中的include_once不同。

至少有三种方法可以使用include_once。

最简单的方法是使用它在一个或多个站点的多个页面上包含文本。例如,您可能有一个hours.inc文件,其中包含办公时间和技术支持号码。然后,您可以将此文件包含在网站的联系人,支持和页面上。如果您更改小时数,则在一个文件中更改它们。

与第一次使用相关的是具有该站点的全局变量的文件。例如$ company_name =“我们的公司”。 $ company_phone =“800-555-1212”等

此文件将与header.inc和footer.inc一起使用。在这种用途中,它更像是某些语言所谓的宏替换。

但PHP最强大的用途是根据一些输入生成代码。在我的许多网站上,我有一个PHP包含文件,可根据产品ID生成数十个产品页面。页面本身只有几行,
        require_once('set_variables.inc.php');
require_once('./header.inc');
$page = mysql_real_escape_string($_GET['p']);
if (file_exists("pages/$include_page") ) {
require_once("pages/$include_page");
} else {
require_once("pages/missing.inc");
}
require_once('./footer.inc');
我可以阅读此页面并确切知道发生了什么。我很难跟踪我的观点,当他们长达800行时会发生什么 这是一种非常有用的语言功能,我无法想象它不是目标C的一部分。我无法弄清楚的是如何做到这一点。我确定它涉及创建某种类的类,以保持代码重用,但我看过的所有示例都没有这样做。

所以我正在寻找的是暗示Objecive-C如何实现这个PHP功能:
     $number_of_button_sets = 3;
inlcude_once('buttons');

4 个答案:

答案 0 :(得分:6)

Objective-C具有#import指令。

答案 1 :(得分:1)

PHP的include_once只是将一个文件包含在另一个文件中的机制。 Objective-C中的这种直接类比是#import。但是你似乎在谈论重用接口代码,这是一个非常不同的概念。

如果你想要的只是屏幕上的一个项目,你可以继承UIControlUIView。然后,您可以在通常使用这些类型的对象的任何地方使用它们 - 您可以将UIView拖到nib上,然后将类更改为自定义类,或者可以直接在代码中实例化它并将其添加为子视图到您现有的一个视图。

在您使用它的任何代码文件中,您需要#import子类的头文件。

答案 2 :(得分:1)

简短的回答是“这不是你在iOS中做的事情”。

您可以使用#defines模仿PHP包含的代码替换功能。如果你愿意,你可以像在PHP中一样编写代码并将重复部分拖入#defines。将它们放入{ProjectName} -Prefix.pch,它们将自动可用于您的所有课程。

您要做的是重新构建代码,以便它使用模型 - 视图 - 控制器模式。从主视图中拉出与模型相关的代码并将其放入一系列类中。与视图相关的代码相同。有时这就是你需要做的所有事情,有时它会变得更加复杂。

例如,在我的测验标题中,我有一个首选项窗格,用户可以在其中选择要对其进行测验的类别和难度。当游戏首次初始化时,我需要在NSUserDefaults中设置默认首选项。我为代码创建了一个类,并使用

调用它
PreferencesInitialization *prefs =[[PreferencesInitialization alloc] init];
[prefs initializePreferences];

上面的代码片段就像PHP include一样,并在调用时运行代码。

如果相关代码与当前视图或数据没有交互,那么该方法可以正常工作。在测验游戏中,我将评分按钮放在屏幕底部的工具栏中。我将所有代码从视图中删除并将其放入类中。我像上面那样打电话给班级。除了该类对它所运行的环境一无所知。因此我需要传递它需要了解的所有

self.scoringToolbar = [[ScoringToolbar alloc] initWithScoreKeeper:self.scoreKeeper parentView:self.view];

这是一个有点棘手的地方,它需要知道scoreKeeper(结果的类)和当前视图的当前实例。为了将工具栏放置在屏幕的底部,scoringToolbar使用self.view信息来计算位置。所有self.view计算都更改为self.parentView。 e.g。

CGSize windowSize =  self.parentView.frame.size;

scoringToolbar完全是自包含的,因此一旦它具有初始参数,它就会自行运行。视图控制器可以通过调用其方法从中获取信息。

第三种类型的交互是视图控制器告诉对象做某事,比如播放声音,目标告诉视图控制器何时完成。他们这样做的方式是使用代表。我将游戏的录制和播放部分从主视图中拉出来并将其放入课堂中。就像scoringToolbar一样,它需要知道当前的视图。

self.recordPlay = [[RecordPlay alloc] initWithParentView:self.view ];
[self.recordPlay setDelegate:self];

告诉recordPlay类使用playSound方法播放声音。

[self.recordPlay playWord:targetSnd];

通过将视图控制器设置为recordPlay的委托,可以在声音播放结束时通知它并做出相应的响应。

在recordPlay中调用

[self.delegate soundFinishedPlaying:self.soundToPlay];

这将调用视图控制器中的soundFinishedPlaying方法,并执行适当的操作。就像告诉图片类突出显示图片或者使用recordPlay类播放下一个声音一样。

代表结果是模型 - 视图 - 控制器模式的关键。在我的游戏中,控制器使用wordList中的方法向wordList类询问单词。如果没有任何单词,wordList委托让控制器知道,控制器启动preferencesPane。单击图片时,pictureView类告诉控制器,控制器决定播放哪个声音。然后它告诉recordPlay类播放哪种声音。

类不相互通信 - 事实上他们甚至不了解彼此。控制器是一个中间人,它会告诉其他人该怎么做。

我认为这对于具有面向对象背景的人来说是显而易见的,但我花了一年的时间才弄明白。我已经重写了我的游戏以使用这些概念并且更容易管理。通过交换课程,我可以在几个类似的游戏中重用基本结构。

希望他帮助别人。

答案 3 :(得分:0)

您可以编写代码来放置您喜欢的任何控件(在合理范围内),将代码放入函数中,并多次调用该函数以显示控件的多个副本。