UIViewController & UIview dealloc не вызывают - PullRequest
7 голосов
/ 20 декабря 2010

У меня есть контроллер вида на основе навигации, и в контроллере вида я спрятал верхнюю панель навигации и использую пользовательский UIView в качестве панели навигации.

На панели UIView есть кнопка «Назад», и я использую методы «Делегат» (я объявил протокол) для связи с контроллером представления при нажатии кнопки «Назад».

Я использую делегат в моей панели CustomNavigation. идентификатор делегата;

и в главном контроллере вида, когда я выделяю панель навигации, я устанавливаю делегата

topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)];
topBar.lblTitle.text = @"Shop";
topBar.delegate = self;

Я освобождаю эту панель в сделке ViewControllers.

Теперь, когда я нажимаю кнопку «Назад», я использую метод делегата для вызова popViewController в главном ViewController.

//in Custom Bar
-(void)ButtonPressed {
    [delegate TopNavigationBarBackButtonPressed];   
}

//In View COntroller
-(void)TopNavigationBarBackButtonPressed {

    [self.navigationController popViewControllerAnimated:YES];
}

Теперь ViewController открывается, и элемент управления переходит к предыдущему viewController, но dealloc не запускается ни в ViewController, ни в UIView

Что я делаю не так?

1 Ответ

17 голосов
/ 23 декабря 2010

OK! Наконец понял, в чем проблема.

Да, это был делегат. Поэтому в моем методе «нажата кнопка назад» мне нужно установить для делегата значение NIL.

-(void)TopNavigationBarBackButtonPressed {

 topBar.delegate = nil;
[self.navigationController popViewControllerAnimated:YES];
}

И вуаля, все колллоки были вызваны. Будь ты проклят пользовательский протокол. 2 дня моей жизни я никогда не вернусь.

EDIT: ОК, нет необходимости устанавливать делегата на ноль.

У меня были все проблемы, потому что в собственности я оставлял делегата.

@property(nonatomic, retain)id <ASNavigationDelegate>delegate;

Это должно быть

@property(assign)id <ASNavigationDelegate> delegate;
...