Команды пользовательского интерфейса пропущены в IBAction - PullRequest
2 голосов
/ 22 февраля 2012

Вот мой код:

-(IBAction)saveDownloadedImage
{
    NSLog(@"Test");    EXECUTED
    indicatorView.hidden = NO;  NOT EXECUTED
    [indicatorView startAnimating];  NOT EXECUTED
    [statusLabel setText:@"WHY?"];  NOT EXECUTED
    [currentPicture setImage:[imageView image]];   EXECUTED
    ImageFileManager *fileManager = [[ImageFileManager alloc] init]; EXECUTED
    [fileManager saveImageToDisk:currentPicture]; EXECUTED
    indicatorView.hidden = YES;
    [statusLabel setText:@"Image saved successfully."]; EXECUTED
    saveButton.enabled = NO; EXECUTED

}

Процесс сохранения занимает около 5 секунд.Поэтому было бы нормально видеть индикатор в пользовательском интерфейсе.Но ничего не происходит!Есть идеи?

Ответы [ 4 ]

7 голосов
/ 22 февраля 2012

Все выполнено. Ваша проблема в том, что вызов saveImageToDisk является синхронным, и вы вызываете его из потока пользовательского интерфейса. Когда вы блокируете поток пользовательского интерфейса, ничего не перерисовывается. Индикатор отображается, но его нельзя отобразить на экране, пока не вернется IBAction, когда он снова будет скрыт.

Вы должны вызывать метод сохранения асинхронно.
Блокировка потока пользовательского интерфейса никогда не бывает хорошей идеей.

Изменить: см. Ответ на следующий вопрос для правильного решения: асинхронные вызовы базы данных в IOS

Edit2: одно из возможных решений (не проверено)


-(IBAction)saveDownloadedImage {
    indicatorView.hidden = NO; //Note you can use hidesWhenStopped property for this
    [indicatorView startAnimating];
    [statusLabel setText:@"BECAUSE..."];
    [currentPicture setImage:[imageView image]];

    [NSThread detachNewThreadSelector:@selector(save) toTarget:self withObject:nil]
}

- (void)save {
    @autoreleasepool {
        ImageFileManager *fileManager = [[ImageFileManager alloc] init];
        [fileManager saveImageToDisk:currentPicture];

        [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
    }
}

- (void)updateUI {
    indicatorView.hidden = YES;
    [statusLabel setText:@"Image saved successfully."];
    saveButton.enabled = NO;
}

1 голос
/ 22 февраля 2012

В My Perception вы запускаете основной поток индикатора активности.

Вместо того, чтобы показывать индикатор в главном потоке

, вы должны вызывать индикатор в отдельной теме, как показано ниже.

-(IBAction)saveDownloadedImage
{
NSLog(@"Test");    EXECUTED
commented below code
//indicatorView.hidden = NO;  NOT EXECUTED
// [indicatorView startAnimating];  NOT EXECUTED
//instead of main thread create new Thread as Below
[NSThread detachNewThreadSelector:@selector(showloader) toTarget:self withObject:nil];
[statusLabel setText:@"WHY?"];  NOT EXECUTED
[currentPicture setImage:[imageView image]];   EXECUTED
ImageFileManager *fileManager = [[ImageFileManager alloc] init]; EXECUTED
[fileManager saveImageToDisk:currentPicture]; EXECUTED

[statusLabel setText:@"Image saved successfully."]; EXECUTED
saveButton.enabled = NO;
[indicatorView stopAnimating:YES];
indicatorView.hidden = YES;
}


//Custome method For shoing the Indicator.
-(void)showloader{
//call below method  here indicatorView object created already.
[indicatorView startAnimating]
}

It'll definitely work
1 голос
/ 22 февраля 2012

Вы уверены, что

1) displayView и statusLabel не равны нулю, а

2) displayView и statusLabel добавляются как подпредставления для self.view?

0 голосов
/ 22 февраля 2012

Вам нужно объявить свой метод с отправителем, подобным этому

-(IBAction)saveDownloadedImage:(id)sender
...