Как показать «Загрузка UIAlertView» для системной команды? - PullRequest
0 голосов
/ 15 января 2012

Я пытаюсь заставить загрузку UIAlertView с ActivityIndicator всплывать, как только я нажимаю кнопку.В этот момент мне нужно запустить команду dpkg .

Я очень близок к ее завершению.Есть только одна проблема, когда я касаюсь своей кнопки, UIAlertView загружается не полностью (затемненный экран), пока приложение устанавливает пакет debian.Как только пакет завершит установку, UIAlertView загружается полностью за секунду.Затем отклоняется с [alert dismissWithClickedButtonIndex:0 animated:YES];

Я не уверен, если это должно быть в другом потоке, поэтому я попытался сделать это.Не уверен, правильно ли я это настроил.Так вот мой код.Предложения?Исправления?

.m

-(IBAction)installdeb:(id)sender{
    UIAlertView *alerty = [[UIAlertView alloc] initWithTitle:@"Installing..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil];
    UIActivityIndicatorView *progress= [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)];
    progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    [alerty addSubview:progress];
    [progress startAnimating];
    [alerty show];
    [alerty release];
    [NSThread detachNewThreadSelector:@selector(installdeb) toTarget:self withObject:nil];
}

- (void)installdeb{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    char *installdebchar = [[NSString stringWithString:@"dpkg -i /Applications/MyApp.app/package.deb"] UTF8String];
    system(installdebchar);
    if (system(installdebchar) == 0){
        [alerty dismissWithClickedButtonIndex:0 animated:YES];
        UIImage *img1 = [UIImage imageNamed:@"whitecheckmark.png"];
        [ImageView1 setImage:img1];
    } else {
        [alerty dismissWithClickedButtonIndex:0 animated:YES];
    }
    [pool release];
}

.h

@class DebInstallViewController;

@interface DebInstallViewController : UIViewController <UINavigationBarDelegate, UINavigationControllerDelegate, UIAlertViewDelegate>{

    IBOutlet UIAlertView *alert;

    IBOutlet UIImageView *ImageView1;

}

- (IBAction)installdeb:(id)sender;

@end

Я вроде как новичок в цели c,Так что не ненавидь.:) Предложения?

1 Ответ

1 голос
/ 15 января 2012

Похоже, вы выбираете правильный общий подход.Однако есть несколько вопросов.Во-первых, неясно, откуда появляется «настороженность» в «installdeb».Я предполагаю, что вы хотели использовать переменную-член 'alert'?

Если предположить, что это так, то основная проблема низкого уровня, которую я вижу в вашем коде, заключается в том, что вы пытаетесь вызвать dismissWithClickedButtonIndex: animated: on aфоновый поток.Документы Apple утверждают, что все взаимодействия UIKit должны происходить в главном потоке, если явно не указано иное.

Убедитесь, что при назначении предупреждающего ивара оно сохраняется правильно.

Теперь естьпроблемы высокого уровня того факта, что вы вызываете системные команды из того, что выглядит как приложение для iOS ... но я просто предполагаю, что вы знаете, что там делаете ...

...