ios - 未在 UITabBarController 内部调用 cellForRowAtIndexPath

标签 ios uitableview uitabbarcontroller

这个问题已经在这里多次提到,但我的情况略有不同,我正在做的事情是,当我切换到第二个 UITableViewController 时,UITabBarController 中有两个 UITableViewController ,不会触发 cellForRowAtIndextPath 方法来用以下数据填充 UITableViewController在通过互联网搜索许多解决方案后,使用 AFNetworking 从我的服务器中提取我发现的所有问题不包括 UITabBarController 例如 question 1 , question 2 , question 3 , question 4 , question 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

最佳答案

success里面的代码AFNetworking 的 block request 是异步调用的,这就是为什么显示 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

关于ios - 未在 UITabBarController 内部调用 cellForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37375095/

相关文章:

ios - UITableViewCell subview 不遵守自动布局约束

objective-c - iPad 上的 UITableViewCell 宽度错误?

ios - UITableViewCell 显示错误的字符串

ios - 如何从 UIButton 转到标签栏项目?

ios - 更改帧大小时如何禁用内容比例动画?

ios - .reloadData() fatal error : unexpectedly found nil while unwrapping an Optional value

ios - 如何在 IOS 8 中使 UINavigationBar 透明?

swift - 在 UITabBarController 中的 tabBar 和导航 View 之间添加 UIView

ios - 在 Swift 中使用 NSNotificationCenter 在选项卡栏 Controller 之间传递数据

ios - 在 WatchOS 端创建自定义 Long-Nook 通知