【问题标题】:How to hide loader if tableview cell data appeared?如果出现 tableview 单元格数据,如何隐藏加载程序?
【发布时间】:2018-04-10 13:25:06
【问题描述】:

我将 CircularSpinner 加载程序应用于我的 tableview 列表。如果单元格已加载,如何隐藏加载程序?现在每次访问都会显示加载器。

示例代码如下:-

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [CircularSpinner show:@"Loading" animated: TRUE type:CircularSpinnerTypeDeterminate showDismissButton:[NSNumber numberWithBool:TRUE] delegate:self];
    [CircularSpinner setValue:0.4 animated: TRUE];
}

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){
        [CircularSpinner setValue:1.0 animated: TRUE];
    }
}

已编辑:-

这是我调用 API 的函数,setUpData 将在 ViewDidLoad 中调用。

-(void)setUpData{
    [self.manager GET:@"http://api.XXX.com/api/announcement" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

        _serverDataArr = responseObject;

        self.dataArr=[NSMutableArray array];

        for (NSDictionary *subDic in self.serverDataArr) {

            Announcement_Model *model=[[Announcement_Model alloc]initWithDic:subDic];
            [self.dataArr addObject:model];

        }

        _rowArr=[Events_DataHelper getFriendListDataBy:self.dataArr];
        _sectionArr=[Events_DataHelper getFriendListSectionBy:[_rowArr mutableCopy]];


            [self.tableView reloadData];

        } failure:^(NSURLSessionTask *operation, NSError *error) {
            // [CircularSpinner setValue:1.0 animated: TRUE];
            UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Please try again"
                                                                             message:[error localizedDescription]
                                                                      preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Ok"
                                                               style:UIAlertActionStyleCancel
                                                             handler:nil];

            [alertVC addAction:okAction];

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

    }

【问题讨论】:

  • 您是否在最后一个索引处的 willDisplayCell 方法中调用任何 API 或从本地数据库(延迟加载)获取数据?
  • 使用CircularSpinner.hide()
  • 嗨 Vinaykrishnan,不。
  • @Test87 你的tableView(_:cellForRowAt:) 里有什么?
  • @staticVoidMan,表格单元显示标题标签、日期和描述

标签: ios objective-c uitableview loader


【解决方案1】:

你可以通过实现completionHandler来实现。

例如:

func fetchApi(completion: (Bool)->()) {

    // Getting the data request......
    completion(true)
}

像这样调用你的函数:-

fetchApi(completed: Bool) {
  if completed {
     // Hide your spinner
  }
}

我相信你可以在 ObjC 中做同样的事情。希望这会有所帮助。

【讨论】:

  • 感谢分享。介意分享一下 Obj-C 版本的解决方案吗?而对于 fetchApi (completed:bool)...在 viewdidload 中调用这个函数?
  • 您可以参考here的答案。希望这会有所帮助。
【解决方案2】:

在下面的代码中添加CircularSpinner.hide()

希望self.manager 调用 API func 并在此处的闭包中给您响应。

-(void)setUpData{
    [self.manager GET:@"http://api.XXX.com/api/announcement" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
        [CircularSpinner hide]; // <- (1)
        _serverDataArr = responseObject;

        self.dataArr=[NSMutableArray array];

        for (NSDictionary *subDic in self.serverDataArr) {

        Announcement_Model *model=[[Announcement_Model alloc]initWithDic:subDic];
        [self.dataArr addObject:model];

        }

        _rowArr=[Events_DataHelper getFriendListDataBy:self.dataArr];
        _sectionArr=[Events_DataHelper getFriendListSectionBy:[_rowArr mutableCopy]];


        [self.tableView reloadData];

        } failure:^(NSURLSessionTask *operation, NSError *error) {
        // [CircularSpinner setValue:1.0 animated: TRUE];

        [CircularSpinner hide]; // <- (2)

        UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Please try again"
        message:[error localizedDescription]
        preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Ok"
        style:UIAlertActionStyleCancel
        handler:nil];

        [alertVC addAction:okAction];

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

}

【讨论】:

  • .hide 在 Objective c 版本中不支持。错误消息显示“在 'CircularSpinner' 类型的对象上找不到属性 'hide'”
  • @Test87 对不起,我用swift写的,请用objc风格的[CircularSpinner hide];
  • 仍然失败。将出现错误“No known class method for selector 'hide'”
  • @Test87 我在这里检查过它工作正常。所以清理你的项目并再次构建+运行。
猜你喜欢
  • 2016-09-05
  • 2018-09-12
  • 1970-01-01
  • 2021-10-16
  • 2012-12-10
  • 2015-12-08
  • 2011-04-23
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多