4

我正在 Xcode 中为 iPhone 编写一个 iOS 应用程序,我在各自的 .h 和 .m 文件中创建了一些类及其方法(这是两个类,所以基本上我有两对 .h 和 .m 文件)

我现在想开始编写我的主循环,只要用户点击播放按钮就会执行,但我到底在哪里做呢?

我在 ViewController.m 中这样做吗?例如在这个方法里面:

- (IBAction)playPressed:(UIButton *)sender 
{
    // main loop executed in here ?
    // or simply message to the main loop to start executing is *sent* from here ?
}

我在这里读到了一个类似的问题,有人建议 AppDelegate。现在是 AppDelegate.m 还是 AppDelegate.h ?如果是这种情况,我是开始编写代码还是将所有内容都包含在以下内容中:

int main(int argc, char **argv)
{
   ....
}

在 Appdelegate 文件中?

我试图在我创建的 game.m 文件中简单地开始实例化类并声明泛型方法(不属于任何特定的类),我一尝试就得到一个初始化元素不是编译时常量警告实例化任何东西

有什么帮助吗?来自 c++ 它真的会帮助我一劳永逸地澄清在哪个文件中编写我的主循环以及我是否应该将它包装在某种 int main() 函数中。

谢谢!

PS:

以防万一,我的 ViewController 将仅包含一个播放按钮,该按钮将在按下时开始执行我的主循环,以及一个将终止执行主循环的停止按钮

我在 ViewController.m 中创建了它们各自的方法:

- (IBAction)playPressed:(UIButton *)sender 
{
    // 
}

- (IBAction)stopPressed:(UIButton *)sender 
{
    //  ??
}

暂时是空的:)

4

3 回答 3

2

iOS 上的编程方法与 C++ 方法不同。实际上,在 C++ 中,您必须进行无限循环并在每一帧进行触摸、绘制所有内容等。直到玩家按下“退出”并打破循环。在 iOS 上,情况有所不同:您已经有一个 main.m 文件,其中有一个 main 函数。这将启动应用程序委托。该应用程序委托会告诉您应用程序何时完成启动、进入后台、进入前台等。当应用程序完成启动时,您将进入您的第一个实际屏幕。在那里,您添加子视图。您不会在每一帧都绘制它们。一旦您将视图添加到父视图,这将自动为您完成。iOS 上的编程是基于事件的。你不 不必检查触摸并查看触摸位置是否在按钮上,然后调用该按钮的方法。相反,您为按钮设置了一个回调方法,一旦按下按钮,它就会自动为您调用。当然,您首先需要分配按钮并将其添加到父视图。

一旦你习惯了这种基于事件的编程模型,你肯定会喜欢它。一开始它可能会很不一样,也许它对你没有意义,但不要担心。来自 C++ 背景肯定是一个好的开始。

干杯,

乔治

编辑:在这种情况下,我可以提供更具体的信息:所以,您从第一个屏幕中的 AppDelegate 开始。我们称之为 MainAppScreen。现在,您需要添加这 2 个按钮并为它们设置选择器(回调方法)。我可以看到你已经这样做了。

现在 :

- (IBAction)playPressed:(UIButton *)sender
{
    running = TRUE;
    [self performSelectorInBackground:@selector(myLoop) withObject:nil];
}
- (IBAction)stopPressed:(UIButton *)sender 
{
    running = FALSE;
}
- (void) myLoop
{
    while(running)
    {
       //this is your loop. You can code in here.
    }
}

其中 running 是 MainAppScreen 类中的一个实例变量。

希望这可以帮助。

干杯!

于 2012-07-06T13:38:22.993 回答
1

每个 iOS 应用程序以及每个可执行文件都有一个入口点 - 这是 main()。一个可执行文件的入口点不能超过一个。如果您仔细查看该项目,您会发现Xcode 的导航main.m器中的组中有一个自动生成的文件,Supporting Files如下所示:

#import <UIKit/UIKit.h>

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

你想要做什么还不够清楚,但这是一个很好的开始阅读 iOS 应用程序的结构和生命周期、objective-c 语法、熟悉UIKitApple 提供的框架和至少一些框架。

于 2012-07-06T13:29:40.817 回答
1

您在 iOS 应用程序中没有 a main(好吧,从技术上讲,您确实有一个 main,但您不必担心编写它)。这一切都为你处理好了。运行循环也为您完成。你所要做的就是创建你的按钮,然后告诉它(通过 addTarget 方法)当它被按下时运行哪个方法。

更新:这是你需要做的伪(ish)代码......

[startButton addTarget:@selector(startPressed:)];
[stopButton addTarget:@selector(stopPressed:)];

-(void)startPressed {
  backgroundThread = [[NSThread alloc] initWithWhateverYouWantToRun];
  [backgroundThread start];
}

-(void)stopPressed {
  [backgroundThread stop];
}

在您的后台线程中,如果您想更新 UI,您会调用sendMessageOnMainThread(或类似的东西 - 目前不记得确切的细节!)

于 2012-07-06T13:29:56.010 回答