0

接続がタイムアウトしたときに「接続タイムアウト」アニメーションをユーザーに表示するために使用する小さなサブクラス化された UIView があります。サブビューが表示されたときに、ユーザーがテーブルをスクロールしてもスクロールしないように、scrollViewDidScroll というコードをメソッドに追加しました。ただし、接続タイムアウトビューのアニメーション化が完了し、ビューがスーパービューから削除されると、テーブルビューがスクロールされるたびに、割り当て解除されたインスタンスエラーに送信されたメッセージが表示されます。サブビューがゼロかどうかを確認するためにチェックを入れましたが、うまくいかないようです。どうすればこれを回避できますか?

サブビューの提示方法:

// 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);
    }
}
4

1 に答える 1

0

ビューの割り当てがすぐに解除されない場合があります。代わりに試してください: if ([noInternetView superview] != nil) {}

于 2013-03-13T01:00:20.803 に答える