无法从屏幕中删除UIActivityIndi​​cator和包含它的视图

时间:2013-08-29 16:26:48

标签: ios uiactivityindicatorview

我复制了代码以显示此post中的活动指示符。当我打电话hideActivityViewer时没有任何事情发生,activityView仍在那里,而且activityIndi​​cator仍在旋转。就好像hideActivityViewer根本不对activityView做任何事情。

这是我修改过的代码

-(void)showActivityViewer
{
    WBAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    UIWindow *window = delegate.window;

    _activityView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, window.bounds.size.width, window.bounds.size.height)];
    _activityView.backgroundColor = [UIColor blackColor];
    _activityView.alpha = 0.5;

    UIActivityIndicatorView *activityWheel = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(window.bounds.size.width / 2 - 12, window.bounds.size.height / 2 - 12, 24, 24)];
    activityWheel.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    activityWheel.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleTopMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);
    [_activityView addSubview:activityWheel];
    [window addSubview: _activityView];

    [[[_activityView subviews] objectAtIndex:0] startAnimating];
}

-(void)hideActivityViewer
{
    NSLog(@"Profile: hiding Activity Viewer");
    [[[_activityView subviews] objectAtIndex:0] stopAnimating];
    [_activityView removeFromSuperview];
    _activityView = nil;
}

更新 我正在使用KVO来检测变量的变化并使用它来调用showActivityViewer。 事实证明,showActivityViewer被多次调用,因此屏幕上有多个activityViewer,所以当我删除一个时,另一个仍然在那里,我没有引用它。我通过检查activityView是否已经存在来解决这个问题,如果不存在则不会创建一个新的。

2 个答案:

答案 0 :(得分:0)

您可能正在从异步或线程完成块中调用ur方法“hideActivityViewer”。 如果是这样,请在mainthread上调用ur方法,即     [self performSelectorOnMainThread:@selector(hideActivityViewer)withObject:nil waitUntilDone:NO];

答案 1 :(得分:0)

我的评论作为答案:

可能是因为activityView在调用hideActivityViewer之前的某个时刻变为零。让我们说你连续两次打showActivityViewer,你有两个activityViews完全相同,如果你打hideActivityViewer,第一个永远不会被隐藏。即使在匹配hideActivityViewer次来电之后,或者更多。