2012-09-30 55 views
0

當用戶點擊iPhone應用程序頁面中的圖像時,我想首先顯示自定義彈出窗口(這是用戶消息說「正在處理您的請求」 ),「開始」圖像觸摸處理之前。但是,不知何故,處理開始(甚至沒有顯示彈出窗口,儘管我已經編寫了代碼來在處理代碼之前顯示彈出窗口),但幾乎只會結束&,只有彈出窗口才會顯示。你能幫忙嗎?CocoaTouch - iPhone應用程序 - 執行前繼續顯示對話框

這是代碼片段:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    int emotionChosen = -1; 
    [self showUserNote:msg]; 
    ... 
    ... 
    // This then calls a method to process the touch event 
    ... 
    ... 
} 

-(void) showUserNote:(NSString *)note { 

    if ((self.viewCtrlrUserNote == nil) || (self.viewCtrlrUserNote == NULL)) { 
     self.viewCtrlrUserNote = (ViewController_NoteToUser *) [((com_AppDelegate *) [[UIApplication sharedApplication] delegate]).storyboard instantiateViewControllerWithIdentifier:kNameViewCtrlrUserNote]; 
    } 
    [self.viewCtrlrUserNote.view setFrame:CGRectMake(70.0,150.0,170.0,170.0)]; 
    [self.viewCtrlrUserNote initializeViewWithNote:note]; 
    [self.view addSubview:self.viewCtrlrUserNote.view]; 
    [self.view bringSubviewToFront:self.viewCtrlrUserNote.view]; 
} 

雖然想提出調用showUserNote(其應顯示彈出/對話框)「第一」,「然後僅」正在呼叫,其處理方法觸摸。但處理觸摸的方法首先開始執行&對話框僅在處理方法結束時出現,因此它破壞了目的!

我的開發環境:4.3.3的XCode的iPad,iOS 5的

我如何「任務」認爲iOS的「第一」顯示「之前」開始處理觸摸事件的用戶對話框?

+0

你能解釋爲什麼特定的順序很重要嗎?典型的設計啓動了後臺工作,並在運行循環的相同輪迴中呈現「處理它」UI狀態。這兩件事實際上都是在應用程序返回時開始發生的,並且大部分時間都是人們想要的。你的processTouch代碼中會發生什麼,以破壞用戶界面的變化? – danh

+0

處理代碼需要很長時間纔會出現問題,並且您希望向用戶顯示一條警告以等待? –

回答

2

圖紙和UI命令一般不CocoaTouch同步的(或者實際上,在任何現代圖形API使用3D加速和合成)。當您在-showUserNote:中完成所有工作時,您正在將命令排列到視圖子系統,以便在下次處理事件時執行所有這些操作,而不是實際執行這些操作。

實現你想要的標準模式是使用委託一旦它被繪製,它有視圖回調到代表。 Apple在UIAlert類中使用這種模式,你應該做的就是讓你的代碼使用它來代替你的自定義視圖,然後修改你的自定義視圖來獲得委託並在它顯示後回調。

我強烈建議您閱讀runloops,以便您瞭解事件處理和延遲處理等事情。

+0

謝謝你,路易斯。這給了我一個不同的視角來思考問題!讓我試試看。 – Jean

0

我會嘗試捆綁你想要的對話到一個單獨的方法 後運行代碼,並與一個NSTimer調用它(也是一個好主意,檢查對話由事後//出來的代碼來檢查工作) 像這樣的東西

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTouchEvent) userInfo:nil repeats:NO]; 

其中myTouchEvent是您要創建的方法。

@Lois Bergarg指出,這將可能無法正常工作,這是我的第一個想法....

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.5]; 
    [NSThread sleepUntilDate:future]; 
+2

請不要這樣做。不起作用。第一個選項會睡覺你正在的線程。您可能是在主線程中,所以效果只會引入用戶可見的0.5秒UI凍結,並且仍然在視圖顯示之前運行所有內容。如果您的計時猜測已關閉(例如,如果在加載計時器和啓動計時器之間的1.0秒內進入電話),則第二種情況會引入競爭狀況,導致出現奇怪的錯誤和崩潰。只需設計您的課程以正確使用授權。 –

+0

既然你重新排序了你的文章,我上面所說的所有東西都是真的,除非第二個代碼是絕對不會工作的代碼,你提供的第一個解決方案是有時會顯示工作的第一個解決方案,由於它是一個競賽條件而崩潰。 –

+0

你說這會導致一些問題,而不是它不會工作, 我並不是真的想爭辯或冒犯你,但我認爲如果你正在談論時間賽跑似乎不是一個大問題關於設置始終相同的時間間隔。老實說,我不確定如果你在定時器設定的時間間隔內接到電話以延遲動作,它會如何反應。 我肯定希望更多地瞭解你所建議的答案,我瞭解代表團,但我不確定你在這裏要做什麼,儘管這不是我的問題。不管怎麼說,謝謝你的建議。 –

相關問題