UIActivityIndicatorView всегда вылетает - PullRequest
0 голосов
/ 07 июня 2011

Мой UIActivityIndicatorView всегда вылетает из моего приложения.
Когда я нажимаю кнопку загрузки, индикатор показывает и начинает вращаться.
Но когда я его прекращаю, мне просто нужно где-то коснуться экрана, и мое приложение вылетает.

.h

@interface DownloadViewController : UIViewController < FinishedParsing, NSFetchedResultsControllerDelegate > 
{
    UIActivityIndicatorView* indicator;
}
@property (nonatomic, retain) UIActivityIndicatorView* indicator;

- (void)initSpinner;
- (void)spinBegin;
- (void)spinEnd;

.m

@implementation DownloadViewController

@synthesize indicator;

- (IBAction)download:(id)sender 
{
    [self initSpinner];
    [self spinBegin];

    [OJSGatewayCommunicationService parseArticles :self];
}

- (void)initSpinner 
{
    self.indicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]autorelease];    

    // we put our spinning "thing" right in the center of the current view
    CGPoint newCenter = (CGPoint) [self.view center];
    indicator.center = newCenter;   
    [self.view addSubview:indicator];   
}

- (void)spinBegin 
{
    [indicator startAnimating];
}

- (void)spinEnd 
{
    self.indicator.hidesWhenStopped = YES;
[indicator stopAnimating];
    indicator.hidden = TRUE;
    [indicator removeFromSuperview];
}

- (void) fetchPDF:(NSMutableArray *)chapters
{
    [self spinEnd];
    ...
}

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

Вместо этого или автоматически выпуская его, возьмите его под контроль и отпустите вручную, вызвав self.indicated = nil после того, как вы закончите с этим, и отпустите его в dealloc.Таким образом, вы уверены, что он не исчезнет без предупреждений ...

1 голос
/ 07 июня 2011

В вашей функции:

- (void)spinEnd {
    [indicator stopAnimating];
    self.indicator = nil;
}

Я бы предложил не устанавливать индикатор на ноль. Действительно, установка self.indicator = nil сделает индикатор разблокированным. Если это также вызывает освобождение, возможно, что пользовательский интерфейс не будет в состоянии правильно перерисовать себя при выполнении основного цикла. Обратите внимание: это всего лишь гипотеза, которую я выдвигаю из-за странного поведения, которое вы ведете. Это может работать или не может.

Я также хотел бы убедиться, что hidesWhenStopped установлен на YES, когда индикатор остановлен. В общем, я бы переписал:

- (void)spinEnd {
    self.indicator.hidesWhenStopped = YES; //-- additional guarantee, but it should already be set
    [indicator stopAnimating];
}

и отпустите indicator в вашем -dealloc:

- (void)dealloc {
    ....
    [_indicator release];
    _indicator = nil;
    ...
    [super dealloc];
}

Кстати, также исправьте утечку памяти в initSpinner:

- (void)initSpinner {
    self.indicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] autorelease];    
    ....

Следует отметить, что при выполнении initSpinner, если indicator уже был там, назначение нового UIActivityIndicatorView для self.indicator приведет к освобождению предыдущего.

EDIT:

Если ни один из вышеперечисленных способов не работает, вы можете попробовать еще две вещи:

  1. установка для свойства индикатора hidden значения YES в -spinEnd;

  2. возможно, я ошибался, но мне кажется, что установка self.indicator.hidesWhenStopped = YES может быть более эффективной перед вызовом [indicator stopAnimating];

...