2014-09-30 3 views
0

У меня есть пользовательская навигация контейнера. У меня есть диспетчер просмотра дневника и контроллер подробного просмотра дневника. Когда пользователь нажимает на изображение в дневнике, он переходит к подробностям дневника, используя метод cycleFromViewController:toViewController, как описано в документах Apple о контроллерах контейнера.observValueForKeyPath вызвано несколько раз

Когда загружается подробный просмотр, я хочу, чтобы контроллер представления контейнера удалял одно из его подзонов и добавлял еще один. Я использую KVC для этого. Это мой первый опыт использования KVC. addObserver метод находится в viewWillAppear в дневнике подробно vc.

Проблема: загружена подробная деталь VC, observeValueForKeypath вызывается один раз в первый раз, дважды второй раз и т. Д. Кроме того, в observeValueForKeypath я добавляю subview - UIButton - и когда он нажимается, cycleFromViewController:toViewController вызывается снова, и предыдущее subview добавляется обратно. Он работает в первую очередь, но в последующих, исходное подвью не добавляется обратно, UIButton просто придерживается.

Дневник Detail.m

-(void)viewWillAppear:(BOOL)animated{ 

[self addObserver:self.parentViewController forKeyPath:@"didLoadNumber" options:0 context:nil]; 

[self setValue:[NSNumber numberWithInt:0] forKey:@"didLoadNumber"];} 

Главная Контейнер VC (наблюдатель/родитель VC)

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 


    NSLog(@"KVO called"); 
    [self.usernameLabel removeFromSuperview]; 
    self.backButton = [[UIButton alloc]initWithFrame:CGRectMake(12, 28, 28, 28)]; 


    self.backButton.backgroundColor = [UIColor blackColor]; 
    [self.view addSubview:self.backButton]; 

    [self.backButton addTarget:self action:@selector(removeButtonAndAddLogo) 
       forControlEvents:UIControlEventTouchUpInside]; 

}

-(void)removeButtonAndAddLogo{ 

NSLog(@"got to remove button"); 
[self.backButton removeFromSuperview]; 
self.usernameLabel = [[UILabel alloc]initWithFrame:CGRectMake(12, 28, 28, 28)]; 
self.usernameLabel.text = @"username"; 
self.usernameLabel.textColor = [UIColor blackColor]; 
[self.view addSubview:self.usernameLabel]; 

[self cycleFromViewController:self.diaryViewController.diaryDetailVC toViewController:self.diaryViewController]; 

}

ответ

1

Для этого вам нужно удалить это в viewWillDisappear met корыто. Если вы выйдете на этот контроллер более одного раза, он будет регистрировать это уведомление снова и снова, и всякий раз, когда вы вызываете это уведомление, он вызывает многократное время (количество времени, которое вы зарегистрировали).

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    [self addObserver:self.parentViewController forKeyPath:@"didLoadNumber" options:0 context:nil]; 
    [self removeObserver:self.parentViewController forKeyPath:@"didLoadNumber"]; 
} 

Я надеюсь, что это вам поможет.

Смежные вопросы