iOS检查以查看视图是否仍然存在

时间:2013-03-13 00:12:02

标签: ios uiview scrollview tableview uianimation

我有一个小的子类UIView,用于在连接超时时向用户显示“连接超时”动画。我已经在方法中添加了一些代码:scrollViewDidScroll,这样当我的子视图显示时,在用户滚动表格时不会滚动。但是,当连接超时视图完成动画,并且从superView中删除视图时,无论何时滚动tableview,我都会收到一条消息,发送给deallocated instance error。我检查了子视图是否为零,但似乎没有用。我怎么能避免这个?

我如何呈现子视图:

// Show No Internet Message
noInternetView = [FCDataController presentNoInternetMessage:self.view];
noInternetViewOrigin = noInternetView.frame.origin;

视图在我的FCDataController类中的显示方式:

+ (NoInternetView *)presentNoInternetMessage:(UIView *)view {

    NoInternetView *internet = [[NoInternetView alloc] initWithFrame:CGRectMake(0, view.bounds.size.height, view.bounds.size.width, 30) andPosition:NoInternetPositionBottom];
    [view addSubview:internet];

    CGRect position = CGRectMake(0, view.bounds.size.height - 30, view.bounds.size.width, 30);

    [UIView animateWithDuration:0.4
                          delay:0.5
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         internet.frame = position;
                     }
                     completion:^(BOOL finished) {
                         NSLog(@"DONE");
                         [self performSelector:@selector(hideInternetMessageForView:) withObject:view afterDelay:2.0];
                     }];

    return internet;
}

+ (BOOL)hideInternetMessageForView:(UIView *)view {

    NoInternetView *internet = [self NoInternetForView:view];
    if (internet != nil) {

        CGRect remove = CGRectMake(0, view.bounds.size.height, view.bounds.size.width, 30);

        [UIView animateWithDuration:0.5
                              delay:1.0
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             internet.frame = remove;
                         }
                         completion:^(BOOL finished) {
                             NSLog(@"DONE");

                             [internet removeFromSuperview];
                         }];
        return YES;
    }
    return NO;
}

+ (NoInternetView *)NoInternetForView:(UIView *)view {

    NoInternetView *internet = nil;
    NSArray *subviews = view.subviews;
    Class internetClass = [NoInternetView class];

    for (UIView  *aView in subviews) {
        if ([aView isKindOfClass:internetClass]) {
            internet = (NoInternetView *)aView;
        }
    }
    return internet;
}

ScorllView方法:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (noInternetView != nil) {

        noInternetView.frame = CGRectMake(self.noInternetViewOrigin.x, self.noInternetViewOrigin.y + self.tableView.bounds.origin.y, noInternetView.frame.size.width, noInternetView.frame.size.height);
    }
}

1 个答案:

答案 0 :(得分:0)

视图可能不会立即解除分配。请改为:if([noInternetView superview]!= nil){}