iPhone — UIActivityIndicatorView не скрывается при остановке

#iphone #hide #uiactivityindicatorview

#iPhone #скрыть #uiactivityindicatorview

Вопрос:

У меня есть пользовательский UIWebView, написанный следующим образом :

.h

 @interface MiniWebViewController : UIViewController {
    NSString* destinationURL;

    UIWebView* webView;
    UIActivityIndicatorView* activityIndicatorView;
}

@property (nonatomic, retain) NSString* destinationURL;

@property (nonatomic, retain) IBOutlet UIWebView* webView;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView* activityIndicatorView;

- (void) run;

@end
  

.m

 @synthesize destinationURL;
@synthesize webView;
@synthesize activityIndicatorView;

- (id) initWithFrame:(CGRect)frame {
    if (self = [super initWithNibName:@"MiniWebView" bundle:nil]) {
        self.destinationURL = @"";

        self.view.frame = frame;
        self.activityIndicatorView.center = self.webView.center;
    }

    return self;
}

- (void) run {
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.destinationURL]]];
}
  

Он вызывается инициализированным из другого ViewController :

 - (void) aFunction {
    MiniWebViewController* oneViewController = [[MiniWebViewController alloc] initWithFrame:CGRectMake(/*Some Rect*/];
            oneViewController.webView.tag = i;
            oneViewController.destinationURL = /*SomeURL*/;
            oneViewController.webView.delegate = self;

            [self.view addSubview:oneViewController.view]; /* the Web view is inside this one */
            [oneViewController run];
    }

    - (void) webViewDidFinishLoad:(UIWebView *)webView {
        int webViewID = webView.tag;
        MiniWebViewController* webViewController = [self.webViews objectAtIndex:webViewID];
        [webViewController.activityIndicatorView stopAnimating];
    }

    - (void)webViewDidStartLoad:(UIWebView *)webView {
        int webViewID = webView.tag;
        MiniWebViewController* webViewController = [self.webViews objectAtIndex:webViewID];
        [webViewController.activityIndicatorView startAnimating];
    }
  

В IB hidesWhenStopped также проверяется. Все связано. Стиль индикатора установлен на «Большой белый» в IB.

При запуске индикатор не большой, а маленький.
Он успешно запущен и остановлен (запускаются вызовы делегатов), но он не скрывается при остановке.

В чем проблема? Я не вижу…

Комментарии:

1. Если вы используете Xcode 3.x, вы сохранили свой XIB-файл? Правильно ли он подключен к вашему контроллеру просмотра? Введите Log инструкцию для проверки, чтобы убедиться, что ваш индикатор не равен нулю. NSLog(@"indicatar nil:%i", activityIndicatorView == nil);

2. @Wayne Hartman : Это не ноль, и, конечно, да, XIB-файл сохранен. К вашему сведению, я использую XCode 4. На данный момент я скрываю его вручную. Но мне интересно, почему он не выглядит большим и почему он не скрывается при остановке…

Ответ №1:

После тщательного изучения вашего кода вы модифицируете UIActivityView в своем init методе. Измените их так, чтобы они были в вашем viewDidLoad . При инициализации ваш просмотр еще не загружен, следовательно, в вашем контроллере еще не создан экземпляр этих объектов.

Это инструкции, которые необходимо переместить:

 self.activityIndicatorView.hidesWhenStopped = YES;

self.view.frame = frame;
self.activityIndicatorView.center = self.webView.center;
  

Это восходит к фундаментальному принципу Objective-C: отправка сообщения nil объекту … возвращает nil . Временами это раздражающая функция, потому что нет предупреждения во время компиляции, равно как и какого-либо исключения во время выполнения — особенности языка.

Комментарии:

1. Возможно, вы правы, но фрейм и центр индикаторов активности правильно настроены при вызове оттуда. И первая строка приведена здесь только для целей тестирования, поскольку это свойство уже установлено в IB. Я мог бы удалить его, это ничего бы не изменило. Даже если он перемещен в viewDidLoad.

2. Ошибка: при перемещении в viewDidLoad self.activityIndicatorView.center = self.WebView.center больше не работает.

3. Я удалил self.activityIndicatorView.hidesWhenStopped = YES из класса. I по-прежнему установлен в IB. Проблема все еще существует, и я не думаю, что это может быть вызвано неправильным размещением инициализации фрейма.

4. Вы можете скрыть действие вручную: [self.activityIndicatorView setHidden:YES];

5. ДА. Вот почему я не понимаю, почему он выполняет автоматическое скрытие.

Ответ №2:

Я глупый, и XCode / cocoa действительно не помогает.

Я загрузил неправильное XIB-имя, которое НЕ существует. Поэтому я прошу загрузить что-то, чего не существует, и приложение все еще работает, даже показывая и используя объекты, которых не существует. Пока один вызов не сработает должным образом. Сбоя нет… Это нонсенс.