如何在加载UITableViewCell时设置UIActivityIndi​​catorView

Wu *_*sen 36 iphone xcode objective-c uiactivityindicatorview ios

我有两个UITableViewControllers,A和B.当我点击表A中的一个单元格时,我将用于UINavigationController推送表格视图控制器B.但是B的数据是从Internet下载的,这需要几秒钟.所以我想UIActivityIndicatorView在加载B时添加一个B.我怎样才能实现这个目标?

Emp*_*ack 52

您可以将UIActivityIndi​​catorView添加为单元格的accessoryView.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.frame = CGRectMake(0, 0, 24, 24);
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryView = spinner;
    [spinner startAnimating];
    [spinner release];
}
Run Code Online (Sandbox Code Playgroud)

  • 问题是在屏幕中央显示一个大的微调器,而不是在每个单元格内. (4认同)

Aru*_*nGJ 30

在tableview B类的viewDidLoad中,添加一个活动指示符.

// Create the Activity Indicator.
    let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
    activityIndicator.hidesWhenStopped = true
    view.addSubview(activityIndicator)

    // Position it at the center of the ViewController.
    activityIndicator.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor)])
    activityIndicator.startAnimating()
Run Code Online (Sandbox Code Playgroud)

现在调用从网络下载数据的方法.

myDownloadMethod()
Run Code Online (Sandbox Code Playgroud)

如果您不希望UI在此过程中无响应,请在不同的主题中执行此操作.

为此阅读此主题. 我可以使用后台线程来解析数据吗?

当您收到下载内容的通知时,请停止指示.

activityIndicator.stopAnimating()
Run Code Online (Sandbox Code Playgroud)

现在您可以调用tableview.reloadData()重新加载表来显示新内容.


cha*_*ika 8

UIActivityIndicatorView * activityindicator1 = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(150, 200, 30, 30)];
[activityindicator1 setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityindicator1 setColor:[UIColor orangeColor]];
[self.view addSubview:activityindicator1];
[activityindicator1 startAnimating];

[self performSelector:@selector(callfunction) withObject:activityindicator1 afterDelay:1.0];

-(void)callfunction
{
// Here your stuf
}
Run Code Online (Sandbox Code Playgroud)


Cao*_*ong 5

对我来说效果很好,你可以试试:

调用[activityIndicator startAnimating]didHighlightRowAtIndexPath调用[activityIndicator stopAnimating]didUnhighlightRowAtIndexPath有用时调用didSelectRowAtIndexPath

- (void)runIndicatorAtIndexPath:(NSIndexPath *)indexPath display:(BOOL)playing{ 
    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryView = activityIndicator;
    playing == YES ?[activityIndicator startAnimating]:[activityIndicator stopAnimating];
}

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    [self runIndicatorAtIndexPath:indexPath display:YES];
}

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath{
    [self runIndicatorAtIndexPath:indexPath display:NO];
}
Run Code Online (Sandbox Code Playgroud)