【问题标题】:observeValueForKeyPath called multiple times多次调用observeValueForKeyPath
【发布时间】:2014-09-30 04:23:05
【问题描述】:

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

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

问题:日记详细信息 VC 已加载,observeValueForKeypath 第一次调用一次,第二次调用两次,依此类推。此外,在observeValueForKeypath 中,我添加了一个子视图——UIButton——当它被点击时,cycleFromViewController:toViewController 被再次调用并且之前的子视图被添加回来。它在第一次运行时有效,但在随后的运行中,原始子视图不会被添加回来,UIButton 只是停留在周围。

日记详情.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];

}

【问题讨论】:

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


    【解决方案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"];
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多