2012-03-09 56 views
0

我正在使用針屏來登錄到我的應用程序。引腳屏幕由四個標籤和一個隱藏文本字段組成。當用戶通過鍵盤輸入文字時,我用符號更新標籤。這工作正常,除了最後一個標籤在登錄開始之前並沒有實際得到更新,並且在登錄過程完成時仍然是空的。在ios中更新標籤後執行操作

這些代碼的相關位:

//an observer has been added elsewhere 
- (void)textDidChange:(NSNotification *)notification 
{ 
    UITextField *field = [notification object]; 
if (field == inputField) 
    { 
    NSString *newText = field.text;  
    if ([newText length] <= pinLength) [self updatePINDisplay]; 
    } 
} 


-(void)updatePINDisplay 
{ 
    if ([pinText length] > pinLength) return; 

    for (NSInteger ii = 0; ii < [pinText length]; ii++) 
    { 
     UILabel *label = [pinFields objectAtIndex:ii]; 
     [label setText:@"x"]; 
    } 

    for (NSInteger ii = [pinText length]; ii < pinLength; ii++) 
    { 
    UILabel *label = [pinFields objectAtIndex:ii]; 
    [label setText:[NSString string]]; 
    } 

    if ([pinText length] == pinLength) [self login]; 
} 

問題的出現是因爲[自行登錄]啓動最後一個引腳標籤更新之前,其發生其他進程,因此,儘管最後的框是仍然存在的登錄空。

我已經解決該問題曾通過更換

[self login] 

[self performSelector:@selector(login) withObject:nil afterDelay:0.1] 

,但我不喜歡的任意時間延遲。我希望可以在繪製標籤後使用委託方法啓動我的登錄代碼。喜歡的東西:

-(void)labelDidGetDrawn 

任何其他(非破解版)解決方案也歡迎:-)

謝謝!

回答

0

根據您的描述,這聽起來像問題是,第4項不拿得出,直到[self login]結束,這表明該登錄過程需要一定的時間後, 。在iOS中,繪圖不會立即發生,這就是爲什麼只有在操作系統有機會更新顯示之後才推遲登錄才能獲得繪圖。

您在這裏使用了一個合理的解決方案。另一種方式(可以說是少一點破解)是讓-[self login]在單獨的線程上產生登錄,或者至少使用異步機制(例如NSURLConnection的異步模式,假設您發出網絡請求)。然後,您的主線程將快速將控制權返回給iOS,並且您的框將繪製。

使用Grand Central Dispatch,您可以通過讓-[self login]將網絡代碼放置在後臺線程上,並在完成後臺線程回調到主線程時完成大部分工作。但是,如果您想在登錄過程中響應用戶事件,這可能會導致一些問題。

如果可以的話,異步使用NSURLConnection,並設置代理以在操作完成時向您報告可能是最佳選擇,因爲如果用戶在登錄過程中爲您提供了取消NSURLConnection的操作請求它。

0

如何:

[label setNeedsDisplay:YES]; 
if ([pinText length] == pinLength) [self login]; 
0

是的,該通知以某種方式存在。標籤將在運行循環的下一次迭代中繪製。因此,使用做你login下一個運行循環迭代結束時,例如一個performSelector:afterDelay:0或可能使用

dispatch_async (dispatch_get_main_queue(), ^{ [self login]; }); 

但)這取決於渲染與定時器和dispatch_queues的執行順序。如果在定時器執行之前發生渲染,則全部設置。

和b)不要阻塞主線程。嘗試在後臺線程/併發隊列中執行登錄,或者在主線程上執行異步操作(例如,NSURLConnection)。

相關問題