2013-04-09 49 views
0

我是iOS開發新手,試圖弄清楚這裏發生了什麼。我有一個標籤欄應用程序與多個ViewControllers和類。我的一個課程被調用並更新了可以正常工作的uilabels。然後調用另一個類,它也運行後臺循環,用於更新同一ViewController上的其他一些uilabels,它們使用循環中的第一個條目更新一次,但不會在循環保持在後臺運行時更新。我可以看到循環仍在運行,並且細節在我使用NSLog記錄輸出時發生變化。iOS ViewController uilabel只更新標籤欄應用程序中的旋轉

ViewController也支持旋轉,如果我旋轉屏幕,然後循環中的數字被繪製到uilabel,並被固定,直到我再次旋轉屏幕,即如果我設置循環數到5,然後重置,取決於我在循環中旋轉屏幕的位置取決於1和5之間的哪個數字被繪製到uilabel。

在單個ViewController應用程序上,這個工作正常,循環運行並且uilabels實時更新。

更新uilabels的類從[super viewDidLoad]中調用。

感謝

這裏是循環類: -

+ (void)Loop:(FirstViewController *)vc 

{ 
NSLog(@"start"); 


    static NSUInteger counter1 = 0; 
    NSLog(@"with count %d", counter1); 

    counter1++; 
    NSLog(@"count ++ %d", counter1); 

    NSString *label01 = [NSString stringWithFormat: @"%d", counter1]; 

    //update uilabel 
    vc.cha01.text = label01; 

      if (counter1 >= 5) { 

          counter1 = 0; 

          } 


     // run loop with 1 second delay 
     [self performSelector:@selector(Loop:) withObject:nil afterDelay:1]; 

    } 

回答

1

你循環是錯誤的,在第一次去你傳遞的viewController但是當你調用performSelector:withObject:afterDelay:你逝去的nil

因此vc參數將是nil,只要傳遞vc參數:

// run loop with 1 second delay 
    [self performSelector:@selector(Loop:) withObject:vc afterDelay:1]; 

只是一個提示,你應該使用自定義對象來保存你的數據,然後在- (void)viewDidAppear:(BOOL)animated讀出值和設定標籤。 A UIViewController可以卸載以釋放內存,這可能會導致您的代碼出現問題。

只需使用一個MVC解決方案,從而成爲一個模型,它包含您的數據,字符串在您的情況。然後在MVC中的控制器de UIViewController中設置MVC的視圖部分的標籤。


視圖一旦加載 -(void)viewDidLoad決不會再次調用。這適用於您在 UITabBarController中的所有觀點。

您應該將更新標籤的代碼移動到 - (void)viewDidAppear:(BOOL)animated方法。

+0

工作,非常感謝。我也會看看你的其他建議,看看我如何優化代碼。 – Wez 2013-04-09 15:40:50