2012-06-28 18 views
20

iOS geliştirmede yeniyim, süreölçer çalıştırmak için düz bir amaç var -c sınıfı "MoneyTimer.m", buradan bir UI etiketini güncellemek istiyorum zamanlayıcının değişen değeri. UI öğesinden erişilemeyen bir iş parçacığından nasıl erişileceğini bilmek istiyorum? Xcode 4.2 ve storyboard kullanıyorum.iOS'ta olmayan bir UI dizesinden bir UI etiketi nasıl güncelleştirilir

Böğürtlende, yalnızca olay kilidinin alınmasıyla, kullanıcı arabirimi olmayan kullanıcı arabiriminden bir güncelleştirme yapılabilir. o (örneğin, vb hiç bir "diş" sorun varsa) yapmanız gereken tam olarak bilmek zor yani

//this the code from MyTimerClass 

{... 
    if(nsTimerUp == nil){ 

     nsTimerUp = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(countUpH) userInfo:nil repeats: YES]; 
...} 

(void) countUpH { 

sumUp = sumUp + rateInSecH; 
**//from here i want to update the UI label ** 
... 
} 
+1

Hepiniz ana iş parçacığı gelen ui güncelleyebilir, arka plan iplikten UI güncellenmesi sadece sorunu oluşturur. – rishi

cevap

3

Sorunuz çok bilgi veya detay vermez.

Herhangi bir oranda, MoneyTimer örneğinizin geçerli viewController öğesine bir referansı olduğunu varsayarak performSelectorOnMainThread'u kullanabilirsiniz. Geçmişte aynı şeyi yaptık //

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; 
+0

Ayrıntılar eksikliğinden dolayı üzgünüm, aslında NSObject'ten miras alan bir Timer sınıfım var, oradan da ViewController'ımdan birine bir özellik olarak yerleştirilmiş bir UILabel'ı güncellemek istiyorum. Şimdi UILabel formuna Timer sınıfına erişemiyorum. –

+0

Neden ona erişemiyorsunuz? Timer sınıfınıza bir temsilci özelliği ekleyin ve Timer örneğini oluştururken temsilci olarak iletişim kurmak istediğiniz viewController öğesini ayarlayın. Ardından etiketi güncellemek için temsilci üzerinde bir yöntem çağırın. Bu standart bir iOS tasarım modelidir - bunu tanımak iyi. Ve sadece eğlence için, Timer sınıfında başka işler mi yapıyorsun? Belki de nesne yönelimli oluyorsun ;-) –

2

.

ben Etiket metnini ayarlamak için bir işlevi kullandı:

- (void)updateLabelText:(NSString *)newText { 
    yourLabel.text = newText; 
} 

ve daha sonra aynı sınıfta bu etiket hayatını varsayarsak performSelectorOnMainThread

NSString* myText = @"new value"; 
[self performSelectorOnMainThread:(@selector)updateLabelText withObject:myText waitUntilDone:NO]; 
1

ile ana iş parçacığı üzerinde bu işlevi seslendi:

if(nsTimerUp == nil){ 
     nsTimerUp = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(countUpH) userInfo:nil repeats: YES]; 
    [self performSelectorOnMainThread:@selector(updateLabel) 
              withObject:nil 
             waitUntilDone:NO]; 

    } 

-(void)updateLabel { 
    self.myLabel.text = @"someValue"; 
} 
34

Bunu yapmanın en hızlı ve en basit yolu şudur:

- (void) countUpH{ 

    sumUp = sumUp + rateInSecH; 
    //Accessing UI Thread 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

     //Do any updates to your label here 
     yourLabel.text = newText; 

    }]; 
} 

Bu şekilde yaparsanız, farklı bir yönteme geçmek zorunda kalmazsınız.

Bu yardımcı olur umarım.

Sam

+0

Harika çalışıyor! Teşekkürler! : D –

+0

@ shoughton123, arka planda çalışan bir yöntem içinde [[NSOperationQueue mainQueue] addOperationWithBlock: ... 'diyebilir miyim? Teşekkürler – JFS

+0

Gerçekten de, yavaş cevap için üzgünüm! – shoughton123

2

uygun yolu şudur:

- (void) countUpH { 
    sumUp = sumUp + rateInSecH; 
    //Accessing UI Thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 

    //Do any updates to your label here 
    yourLabel.text = newText; 
    }); 
}