在UITabBarController中没有调用cellForRowAtIndexPath

时间:2016-05-22 13:38:45

标签: ios uitableview uitabbarcontroller

这个问题已经在很多时候提到了这个问题,但是我的情况略有不同,我正在做的事情是UITabBarController里面有两个UITableViewController,当我切换到第二个UITableViewController时,没有触发cellForRowAtIndextPath方法来填充UITableViewController的数据是在通过互联网搜索许多解决方案后,使用 AFNetworking 从我的服务器中取出所有我发现的问题都不包括UITabBarController等 question 1question 2question 3question 4question 5

这是我尝试使用的代码:

#import "newsAndEventTableViewController.h"
#import "SplashViewController.h"
#import "sharedVariables.h"
#import"AFNetworking.h"
#import "UIWebView+AFNetworking.h"
#import "SDWebImageCompat.h"
#import "SDWebImageDownloaderOperation.h"
#import "SDWebImageDownloader.h"
#import "MyGeeksTableViewController.h"
#import "geeksEvent.h"




   @interface newsAndEventTableViewController ()
  {
    NSMutableArray *events;
    geeksEvent *eventObject;
    NSMutableArray *listOfEventsObjects;
   }
   @end

@implementation newsAndEventTableViewController



- (void)viewDidLoad {
        [super viewDidLoad];
        self.tableView.delegate = self;

    UIImage *image = [UIImage imageNamed:@"image.png"];
    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:image];


}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {



    return [events count];
}




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath



{

        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

        [manager GET:@"http://myserver.com/get.php" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
            //        NSArray *products = [jsonDict objectForKey:@"images"];
            //        [products enumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop){
            //           // NSString *productIconUrl = [obj objectForKey:@"imageUrl"];
            //
            //         }];
            //


            NSLog(@"the response is: %@",responseObject);

            events = [responseObject objectForKey:@"events"];



            for (int i  = 0; i < [events count];i++) {


                eventObject  = [events objectAtIndex:i];



                [listOfEventsObjects addObject:eventObject];



            }













        }



             failure:^(NSURLSessionTask *operation, NSError *error) {
                 NSLog(@"Error: %@", error);

                 UIAlertController * alert=   [UIAlertController
                                               alertControllerWithTitle:@"Error"
                                               message:@"pls check your internet connection"
                                               preferredStyle:UIAlertControllerStyleAlert];

                 UIAlertAction* yesButton = [UIAlertAction
                                             actionWithTitle:@"retry"
                                             style:UIAlertActionStyleDefault
                                             handler:^(UIAlertAction * action)
                                             {
                                                 //Handel your yes please button action here


                                             }];
                 UIAlertAction* noButton = [UIAlertAction
                                            actionWithTitle:@"No, Cancel"
                                            style:UIAlertActionStyleDefault
                                            handler:^(UIAlertAction * action)
                                            {
                                                //Handel no, thanks button

                                            }];

                 [alert addAction:yesButton];
                 [alert addAction:noButton];

                 [self presentViewController:alert animated:YES completion:nil];


             }];







    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Display recipe in the table cell
    geeksEvent *event = [events objectAtIndex:indexPath.row];


    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"placeholderimage"];

    UILabel *eventTitle = (UILabel *)[cell viewWithTag:200];
    eventTitle.text = event.eventTitle;
    NSLog(@"the event title is: %@",event.eventTitle);

    UILabel *eventDesc = (UILabel *)[cell viewWithTag:300];
    eventDesc.text = event.eventShortDiscription;

    // Assign our own background image for the cell
    // UIImage *background = [self cellBackgroundForRowAtIndexPath:indexPath];

    //    UIImageView *cellBackgroundView = [[UIImageView alloc] initWithImage:background];
    //    cellBackgroundView.image = background;
    //    cell.backgroundView = cellBackgroundView;


    return cell;
}

/*
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath];

 // Configure the cell...

 return cell;
 }
 */

/*
 // Override to support conditional editing of the table view.
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the specified item to be editable.
 return YES;
 }
 */

/*
 // Override to support editing the table view.
 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
 if (editingStyle == UITableViewCellEditingStyleDelete) {
 // Delete the row from the data source
 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
 } else if (editingStyle == UITableViewCellEditingStyleInsert) {
 // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
 }
 }
 */

/*
 // Override to support rearranging the table view.
 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
 }
 */

/*
 // Override to support conditional rearranging of the table view.
 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the item to be re-orderable.
 return YES;
 }
 */

/*
 #pragma mark - Navigation

 // In a storyboard-based application, you will often want to do a little preparation before navigation
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 // Get the new view controller using [segue destinationViewController].
 // Pass the selected object to the new view controller.
 }
 */

@end

1 个答案:

答案 0 :(得分:1)

success请求的AFNetworking块内的代码是异步调用的,这就是显示tableView时没有数据的原因。

作为建议,您可能希望将AFNetworking请求移出tableView:cellForRowAtIndexPath:方法(例如viewDidLoad),因为这会在每次应用想要显示时触发请求一个单元格,使应用程序无响应并消耗用户带宽。

因此,使用上述建议,代码将为:

#import "newsAndEventTableViewController.h"
#import "SplashViewController.h"
#import "sharedVariables.h"
#import"AFNetworking.h"
#import "UIWebView+AFNetworking.h"
#import "SDWebImageCompat.h"
#import "SDWebImageDownloaderOperation.h"
#import "SDWebImageDownloader.h"
#import "MyGeeksTableViewController.h"
#import "geeksEvent.h"




   @interface newsAndEventTableViewController ()
  {
    NSMutableArray *events;
    geeksEvent *eventObject;
    NSMutableArray *listOfEventsObjects;
   }
   @end

@implementation newsAndEventTableViewController



- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.delegate = self;

    UIImage *image = [UIImage imageNamed:@"image.png"];
    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:image];


    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    [manager GET:@"http://myserver.com/get.php" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

        NSLog(@"the response is: %@",responseObject);

        events = [responseObject objectForKey:@"events"];

        for (int i  = 0; i < [events count];i++) {
            eventObject  = [events objectAtIndex:i];

            [listOfEventsObjects addObject:eventObject];
        }

        // Calling reload data after request is done
        [self.tableView reloadData];
      }

      failure:^(NSURLSessionTask *operation, NSError *error) {
         NSLog(@"Error: %@", error);

         UIAlertController * alert=   [UIAlertController
                                       alertControllerWithTitle:@"Error"
                                       message:@"pls check your internet connection"
                                       preferredStyle:UIAlertControllerStyleAlert];

         UIAlertAction* yesButton = [UIAlertAction
                                     actionWithTitle:@"retry"
                                     style:UIAlertActionStyleDefault
                                     handler:^(UIAlertAction * action)
                                     {
                                         //Handel your yes please button action here


                                     }];
         UIAlertAction* noButton = [UIAlertAction
                                    actionWithTitle:@"No, Cancel"
                                    style:UIAlertActionStyleDefault
                                    handler:^(UIAlertAction * action)
                                    {
                                        //Handel no, thanks button

                                    }];

         [alert addAction:yesButton];
         [alert addAction:noButton];

         [self presentViewController:alert animated:YES completion:nil];
      }];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [events count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Display recipe in the table cell
    geeksEvent *event = [events objectAtIndex:indexPath.row];


    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"placeholderimage"];

    UILabel *eventTitle = (UILabel *)[cell viewWithTag:200];
    eventTitle.text = event.eventTitle;
    NSLog(@"the event title is: %@",event.eventTitle);

    UILabel *eventDesc = (UILabel *)[cell viewWithTag:300];
    eventDesc.text = event.eventShortDiscription;

    // Assign our own background image for the cell
    // UIImage *background = [self cellBackgroundForRowAtIndexPath:indexPath];

    //    UIImageView *cellBackgroundView = [[UIImageView alloc] initWithImage:background];
    //    cellBackgroundView.image = background;
    //    cell.backgroundView = cellBackgroundView;


    return cell;
}

@end