【问题标题】:Objective -c, removeFromSuperview not works every time目标 -c,removeFromSuperview 并非每次都有效
【发布时间】:2015-10-01 08:14:29
【问题描述】:

我正在尝试删除一个视图,有时它可以正常工作,有时不能。我是初学者。我不知道什么问题。我烦了。请让我知道问题所在。我的代码:

-(void)hideNotification
{   
    btnNotification.selected=NO;
    btnHome.selected=YES;
    [notificationScreen.view removeFromSuperview];
    notificationScreen=nil;
    isNotificationScreen=NO;
}

我也试过:dispatch_async(dispatch_get_main_queue(), ^{ [notificationScreen.view removeFromSuperview]; });performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO]; 但没有成功。

【问题讨论】:

  • 什么是notificationScreen?它在哪里定义、创建、销毁、替换?您是否进行了调试以检查您是否有对它的引用,并且它不是正确的实例?

标签: ios objective-c uiview


【解决方案1】:

在这种情况下,我首先要检查的是确保仅在主线程上更新我的 UI。相信你已经尝试过了。

接下来,根据Apple Documentation,我将确保以下几点:

如果视图的父视图不为零,则父视图释放视图。 切勿从视图的 drawRect: 方法中调用此方法。

最后,不确定您的notificationScreen 对象是什么样子,我会尝试在要删除的视图上设置一个标签,然后根据标签值将其删除。不确定notificationScreen 是否指的是您的当前视图控制器,您的上述代码现在可以在其中工作。试试这个:

  1. 设置要删除的视图的标签 (myNotificationView.tag = 1) 初始化并添加到其父视图时。
  2. 当您准备好删除通知视图时,这样做

for (UIView *view in [self.view subviews] ) { if (view.tag == 1 ) { [view removeFromSuperview]; } }

对于第 2 步,您可以强烈引用通知视图并在该对象上调用 removeFromSuperview

【讨论】:

  • 使用标签来识别视图是脆弱的,不太可能解决问题。
  • 是的,这就是我使用该物业的原因。为了解决这个问题,建议使用标记选项。
【解决方案2】:

首先你需要检查你的视图是否是子视图。只需更改如下代码:

-(void)hideNotification
{   
    btnNotification.selected=NO;
    btnHome.selected=YES;
    if([notificationScreen.view isDescendantOfView:self.view]){
         [notificationScreen.view removeFromSuperview];
     }
    notificationScreen=nil;
    isNotificationScreen=NO;
}

【讨论】:

  • 这没什么区别。如果视图没有超级视图,则 removeFromSuperview 无效。这只是添加了一个冗余调用。
猜你喜欢
  • 2014-01-05
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多