2011-11-29 51 views
7

Ivme ölçeri verilerini almak için CMMotionManager kullanıyorum. Mesele, ivme verilerinin periyodik olarak yazdırılmasıdır, örnek değişkenler görünümde değiştirilir, ancak görünüm yeniden çizilmez. hv'un sıfır olmadığını ve her şeyin bağlandığını kontrol ettim. Bir blok içinde setNeedsDisplay çağırma ile ilgili bir sorun mu var?setNeedsGörüntü bir blok içinde çalışmıyor

-(void) viewDidAppear:(BOOL) animated 
{ 
    [super viewDidAppear: animated]; 

    [motionManager startAccelerometerUpdatesToQueue:motionQueue withHandler: 
    ^(CMAccelerometerData *accelerometerData, NSError *error) 
    { 

     NSLog(@"%@",accelerometerData); 

     HypnosisView *hv = (HypnosisView *) [self view]; 

     hv.xShift = 10.0 * accelerometerData.acceleration.x; 
     hv.yShift = -10.0 * accelerometerData.acceleration.y; 

     [hv setNeedsDisplay]; 

    }];  
} 

cevap

12

Bunun nedeni, ana iş parçacığından farklı bir iş parçacığı üzerinde bir UI yöntemini çağırmanızdır.

sizin bloğa ekleyin:
dispatch_async(dispatch_get_main_queue(), ^{ 
    [hv setNeedsDisplay]; 
}); 

türlü yöntem ana iş parçacığı çağrılabilir gerekir kullanıcı arayüzü öğeleri ile uğraşan unutmayın.

+0

Blokta blok, beğeniyorum. :) – Pascal

+0

Bu sorun çözüldü – jorurmol

+0

sorunu çözüldü. Ben bir yabancı olarak, buralarda insanlara bilgili olmak gerçekten çok iyi. –

4

Diğer bloklarda da aynısını yaptım ve işte kullandığınız geri aramada olmasa da işe yaradı. Belki blok ana iş parçacığı üzerinde yürütülmez? Değilse

NSLog(@"Main thread? %d", [NSThread isMainThread]); 

, ana iş parçacığı üzerinde çalıştırmak için setNeedsDisplay zorlayacağını: Sen ile kontrol edebilirsiniz.

+0

Evet, sorun bu, teşekkürler! – jorurmol

0

Sadece @ cocoahero'nun yanıtını test etmek istedim. Ana olmayan bir iş parçacığında bir UIButton için setTitle'u aramayı denedim. Ve başlık değişti. Bunu hem Xcode 5.0.1'i kullanarak iOS 5.1 ve 7.0'ı hedefleyerek denedim. Ayrıca bir ana iş parçacığından setNeedsDisplay aradım ve o da çalıştı. Aramalarımın ana iş parçacığından olmadığından emin olmama neden oldu. Asıl iş parçacığından aramanın sorununun nedeni olduğuna emin değilim, ama en azından orada başka olasılıklar var. Başka bir soru için my answer'a bakabilirsiniz.

İlgili konular