[英]Where does the main-loop go when creating an iOS app?
我在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
{
// ??
}
暫時是空的:)
每個iOS應用程序,以及每個可執行文件都有一個入口點 - 這是main()。 您不能擁有多個可執行文件的入口點。如果仔細查看項目,您將看到Xcode導航器中的Supporting Files
組中有一個自動生成的main.m
文件,如下所示:
#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語法,熟悉UIKit
以及Apple提供的至少一些框架是一個良好的開端。
你沒有在iOS應用程序中使用main
(從技術上講,你確實有一個main,但你不必擔心編寫它)。 這一切都是為你處理的。 runloop也是為你完成的。 您所要做的就是創建按鈕,然后告訴它(通過addTarget方法)按下時要運行的方法。
更新:這是你需要做的偽(ish)代碼....
[startButton addTarget:@selector(startPressed:)];
[stopButton addTarget:@selector(stopPressed:)];
-(void)startPressed {
backgroundThread = [[NSThread alloc] initWithWhateverYouWantToRun];
[backgroundThread start];
}
-(void)stopPressed {
[backgroundThread stop];
}
在你的后台線程中,如果你想更新UI,你可以調用sendMessageOnMainThread
(或類似的東西 - 暫時不記得確切的細節!)
iOS上的編程方法與C ++方法不同。 實際上,在C ++中,您必須在每個幀上進行無限循環並獲取觸摸,繪制所有內容等。 直到玩家按下“退出”並打破循環。 在iOS上,情況有所不同:您已經有一個main.m文件,其中有一個main函數。 這啟動了應用程序代理。 該應用程序代表會告訴您應用程序何時完成啟動,轉到后台,進入前台等等。當應用程序完成啟動時,您將轉到第一個實際屏幕。 在那里,你添加了子視圖。 你不會在每一幀畫出它們。 將視圖添加到父視圖后,將自動完成此操作。 iOS上的編程基於事件。 您不必檢查觸摸並查看觸摸位置是否在按鈕上,然后調用該按鈕的方法。 相反,您為按鈕設置了一個回調方法,一旦按下按鈕,它就會自動為您調用。 當然,首先需要分配按鈕並將其添加到父視圖中。
一旦你習慣了這個基於事件的編程模型,你肯定會喜歡它。 在開始時它可能會非常不同,也許它對你沒有意義,但不要擔心。 來自C ++背景肯定是一個良好的開端。
干杯,
喬治
編輯:在這種情況下,我可以提供更具體的信息:所以,你從第一個屏幕的AppDelegate。 我們稱之為MainAppScreen。 現在,您需要為它們添加這兩個按鈕並設置選擇器(回調方法)。 我可以看到你已經這樣做了。
現在:
- (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類中的實例變量。
希望這可以幫助。
干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.