Изменить панель навигацииItem'sButtonItem - PullRequest
0 голосов
/ 24 мая 2011

У меня есть UIViewController. Я использую rightBarButtonItem элемента навигации как «кнопку перезагрузки». Когда кнопка перезагрузки нажата, я использую leftBarButtonItem для отображения индикатора активности, пока приложение обрабатывает данные для перезагрузки. Здесь все в порядке.
Вот некоторый код:

- (void)initSpinner {
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    activityButton = [[UIBarButtonItem alloc] initWithCustomView: activityIndicator];
    self.navigationItem.leftBarButtonItem = activityButton;
}

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

- (void)spinEnd {
    [activityIndicator stopAnimating];
}
- (void)viewDidLoad {
     [self initSpinner];
     [super viewDidLoad];
    //more stuff going on here....
}
-(void) loadView{
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshFeeds:)];
}

Теперь меня попросили немного изменить логику.
RightBarButtonItem остается как есть. Элемент leftBarButtonItem по-прежнему существует для отображения индикатора активности, но при отсутствии обработки он должен отображать другую кнопку, которая будет отображать новый вид (для некоторой информации) при нажатии.
Итак, я сделал эти изменения:

- (void)initSpinner {
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    activityButton = [[UIBarButtonItem alloc] initWithCustomView: activityIndicator];
}

- (void)spinBegin {
    self.navigationItem.leftBarButtonItem = activityButton;
    [activityIndicator startAnimating];
}

- (void)spinEnd {
    [activityIndicator stopAnimating];
     self.navigationItem.leftBarButtonItem =infoBarButton; //= [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshFeeds:)] autorelease];
}
-(void) loadView{
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshFeeds:)];

    if (infoBarButton == nil){
        UIImage *buttonImage = [UIImage imageNamed:@"info.png"];
        UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [aButton setImage:buttonImage forState:UIControlStateNormal];
        aButton.frame = CGRectMake(0.0, 0.0, 25, 25);

        // Initialize the UIBarButtonItem
        infoBarButton = [[UIBarButtonItem alloc] initWithCustomView:aButton];

        // Set the Target and Action for aButton
        [aButton addTarget:self action:@selector(showInfo:) forControlEvents:UIControlEventTouchUpInside];


    }
    self.navigationItem.leftBarButtonItem = infoBarButton;
}

Хотя кажется, что он работает (кнопка информации есть, и когда я нажимаю «перезагрузить», ActivityIndicator занимает свое место до завершения обработки), я получаю следующее в консоли отладчика:

__NSAutoreleaseNoPool(): Object 0x15ef30 of class UINavigationItem autoreleased with no pool in place - just leaking
 __NSAutoreleaseNoPool(): Object 0x1abd90 of class UIBarButtonItem autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1acb20 of class UIButton autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x15ef30 of class UINavigationItem autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1ad030 of class UIActivityIndicatorView autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1ad030 of class UIActivityIndicatorView autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1a8c40 of class UINavigationButton autoreleased with no pool in place - just leaking
Object 0x941c of class NSCFString autoreleased with no pool in place - just leaking
//MORE similar messages following...

Что я делаю не так? Я надеюсь, что кто-то там может помочь ...
Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Я предполагаю, что вы запускаете задачу «перезагрузки» в фоновом потоке, а когда она завершается, вы вызываете spinEnd из фонового потока.Если в фоновом потоке нет пула автоматического выпуска, вы увидите эти предупреждения.

Поскольку вы должны когда-либо вызывать UIKit методы только из основного потока, вы должны вызвать spinEnd, выполнив:

[self performSelectorOnMainThread:@selector(spinEnd) withObject:nil waitUntilDone:NO];
0 голосов
/ 24 мая 2011

Является ли ваша собственность retain ed? Вы делаете и alloc] init..., но не отпускаете их после присвоения их своим свойствам. Я бы посоветовал проверить Руководство по управлению памятью

...