Question

Thanks in Advance.

I'm using Apple's Reachability Class files to get internet status. When the internet is in active then I'm calling the webservie and storing the response data in sqlite3 database and showing in UITableView. When the internet lost I'm retrieving the data from the database and showing it in the UITableView as well then UITableView is not showing up the data but the total code is working fine. I don't know why it's happening like that please help me out. This is my code

For checking the internet I have written the below code in viewWillAppear:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
    internetReach = [Reachability reachabilityForInternetConnection];
    [internetReach startNotifier];
    hostReach = [Reachability reachabilityWithHostName:@"www.kluebook.com"];
    [hostReach startNotifier];

This is the method I have written

 - (void)checkNetworkStatus:(NSNotification *)notice {
NetworkStatus internetStatus = [internetReach currentReachabilityStatus];
switch (internetStatus) {
    case NotReachable:
        self.internetActive = NO;
        break;
    case ReachableViaWiFi:
        self.internetActive = YES;
        break;
    case ReachableViaWWAN:
        self.internetActive = YES;
        break;
}
NetworkStatus hostStatus = [hostReach currentReachabilityStatus];
switch (hostStatus) {
    case NotReachable:
        self.hostActive = NO;
        break;

    case ReachableViaWiFi:
        self.hostActive = YES;
        break;
    case ReachableViaWWAN:
        self.hostActive = YES;
        break;
}
if (internetActive && hostActive) {
    for (UIButton *subView in [self.view subviews]) {
        if ([subView isKindOfClass:[UIButton class]] && subView.tag == 1001) {
            [subView removeFromSuperview];
        }
    }
    [self showSpinner];
    if (viewTag == 2009) {
        [self performSelectorInBackground:@selector(stopSpinnig) withObject:nil];
        NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
        [ud setObject:[NSNumber numberWithInteger:0] forKey:@"viewTag"];
        [ud synchronize];
    }
    else {
        [self getLoadingData];
    }
    createCardBtn.enabled = YES;
}
if (self.internetActive == NO) {
    createCardBtn.enabled = NO;
    for (EGORefreshTableHeaderView *view in [cardsTableView subviews]) {
        [view removeFromSuperview];
    }
    _refreshHeaderView = nil;
    [_refreshHeaderView removeFromSuperview];

    networkStatusBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    networkStatusBtn.userInteractionEnabled = NO;
    networkStatusBtn.frame = CGRectMake(0, 66, 320, 40);
    [networkStatusBtn setImage:[UIImage imageNamed:@"warning.png"] forState:UIControlStateNormal];
    [networkStatusBtn setTitle:@"No Internet Connection" forState:UIControlStateNormal];
    networkStatusBtn.imageEdgeInsets = UIEdgeInsetsMake(5, 65, 5, 225);
    networkStatusBtn.titleEdgeInsets = UIEdgeInsetsMake(10, 55, 10, 65);
    networkStatusBtn.backgroundColor = [UIColor blackColor];
    networkStatusBtn.titleLabel.textColor = [UIColor whiteColor];
    networkStatusBtn.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:13.0];
    networkStatusBtn.tag = 1001;
    [self.view addSubview:networkStatusBtn];
    resultArray = [sql getAllCardsBasedOnType:701];
    if (resultArray.count == 0) {
        filterBtn.enabled = NO;
        cardsTableView.backgroundView = bgImageView;
        [cardsTableView setScrollEnabled:NO];
    }
    else {
        filterBtn.enabled = YES;
        [cardsTableView setScrollEnabled:YES];
        //cardsTableView.backgroundColor = [UIColor clearColor];
        [self performSelectorOnMainThread:@selector(showTheData) withObject:nil waitUntilDone:YES];
    }
    if (isLoaderViewShowing == YES) {
        [loaderView removeFromSuperview];
        isLoaderViewShowing = NO;
    }
}

}

in showData method I'm just reloading the table view [cardTableView reloadData];

Was it helpful?

Solution

for (EGORefreshTableHeaderView *view in [cardsTableView subviews]) { 
  [view removeFromSuperview]; 
}

The code above removes all subviews from cardsTableView, not just the subviews that are of EGORefreshTableHeaderView type.

Another way to write that would be:

for (id objInSubviews in [cardsTableView subviews]) { 
  EGORefreshTableHeaderView *view = (EGORefreshTableHeaderView *)objInSubviews;
  [view removeFromSuperview]; 
}

You're just telling the for loop to treat the objects as EGORefreshTableHeaderView instances, not to loop only through the objects that are in fact EGORefreshTableHeaderView.

Instead, you want something like this:

for (id objInSubviews in [cardsTableView subviews]) { 
  if([objInSubviews isKindOfClass:[EGORefreshTableHeaderView class]]){
    EGORefreshTableHeaderView *view = (EGORefreshTableHeaderView *)objInSubviews;
    [view removeFromSuperview]; 
  }
}

Or even better, if you have a variable that hods the pull to refresh, you can skip the loop all together. My guess is that _refreshHeaderView is that variable in your case, if so, you can safely remove the loop.

Note that you have another bug here:

_refreshHeaderView = nil;
[_refreshHeaderView removeFromSuperview];

This is just like calling [nil removeFromSuperview]; - which does nothing. You need to reverse the order:

[_refreshHeaderView removeFromSuperview];
_refreshHeaderView = nil;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top