observeValueForKeyPath多次调用

时间:2014-09-30 04:23:05

标签: ios objective-c iphone key-value-coding

我有自定义容器导航。我有一个日记视图控制器和日记详细信息视图控制器。当用户点击日记中的图片时,它会使用{doc}关于容器视图控制器的cycleFromViewController:toViewController方法进入日记详细信息。

当加载详细信息视图时,我希望容器视图控制器删除其中一个子视图并添加另一个子视图。我使用KVC来实现这一目标。这是我第一次使用KVC。 addObserver方法在viewWillAppear日记详细信息vc中。

问题:加载了日记细节VC,第一次调用observeValueForKeypath,第二次调用两次,依此类推。此外,在observeValueForKeypath中,我添加了一个子视图 - UIButton - 当单击它时,再次调用cycleFromViewController:toViewController并添加前一个子视图。它可以在第一次使用时工作,但在后续工作中,原始的子视图不会被添加回来,UIButton只是粘在一起。

Diary 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 个答案:

答案 0 :(得分:1)

为此,您需要在viewWillDisappear方法中将其删除。如果你多次来到这个视图控制器,它会一次又一次地注册这个通知,每当你调用这个通知时,它会多次调用(你已经注册了它的时间)。

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

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

我希望它会对你有所帮助。