从主线程上的超级视图中删除UIView仍然不会删除视图

时间:2015-02-01 22:41:00

标签: ios objective-c

我使用以下代码添加,然后根据某些条件删除UIView。调用noItemsView removeFromSuperView行,但我仍然可以在屏幕上看到该视图。难道我做错了什么?

@interface PantryTableViewController : UITableViewController
{
    NSMutableArray *_pantryItems;
    NoItemsView *_noItemsView;
}
@end

**PantryTableViewController: viewDidLoad:** 

  _noItemsView = [[NoItemsView alloc] initWithMessage:@"Opps! No Items in the Pantry!"];

 dispatch_async(dispatch_get_main_queue(), ^{

    if(_pantryItems.count == 0) {

        [self.view addSubview:_noItemsView];
    }
    else
    {
        // this line gets invoked but the view is still displayed on the
        // screen
        [_noItemsView removeFromSuperview];

    }

    [self.tableView reloadData];

});

解决方案:

缺少if检查以创建noItemsView的实例,如下所示:

if(!_noItemsView)
{
 _noItemsView = [[NoItemsView alloc] initWithMessage:@"Opps! No Items in the Pantry!"];

}

2 个答案:

答案 0 :(得分:1)

您是否打算删除屏幕上已存在的noItemsView?如果是这样,您需要将其存储在属性中,而不是像这样的范围变量。

答案 1 :(得分:1)

您正在创建UIView的新实例并尝试删除从未添加到视图中的实例。 您必须从superview中找到UIView的实例,然后从内存中删除。

你应该这样试试。

dispatch_async(dispatch_get_main_queue(), ^{

if(_pantryItems.count == 0) {
 NoItemsView *noItemsView = [[NoItemsView alloc] initWithMessage:@"Opps! No Items in the Pantry!"];
[self.view addSubview:noItemsView];
}
else
{

// screen
for(UIView *view in [self.view subviews])
  {
     If([ view isKindOfClass:[NoItemsView Class]){
         [view removeFromSuperview];
          view = nil;
         }
     }
}

[self.tableView reloadData];