如何在导航栏中设置活动指示器?

54

我是iPhone开发的新手。我想在导航栏中设置一个活动指示器。但我看到我的活动指示器在导航栏下面。这是我的代码:

- (IBAction) gomethod : (id) sender {
    xxMapSubviewcontroller = [[XxMapSubviewcontroller alloc] init];
    [self.navigationController pushViewController:xxMapSubviewcontroller animated:YES];

    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    activityIndicator.frame = CGRectMake(0.0, 0.0, 20.0, 20.0);
    [activityIndicator startAnimating];

    [xxMapSubviewcontroller.view addSubview:activityIndicator];
}

如何将我的活动指示器设置在导航栏中?请帮我一下。谢谢。

12个回答

88

我将下面这段代码添加到了视图中,想在导航栏中显示活动指示器。

activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
[self navigationItem].rightBarButtonItem = barButton;
[activityIndicator startAnimating];

24
我注意到在 iOS 7 上,如果你不使用activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];,那么指示器将不会出现。 - antf

30

国际汇款代码:

let activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
let barButton = UIBarButtonItem(customView: activityIndicator)
self.navigationItem.setRightBarButton(barButton, animated: true)
activityIndicator.startAnimating()

14

以下代码在Swift中适用:

let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .White)
let refreshBarButton: UIBarButtonItem = UIBarButtonItem(customView: activityIndicator)
self.navigationItem.leftBarButtonItem = refreshBarButton
activityIndicator.startAnimating()

这在 10.1.1 版本中崩溃,错误信息为:libc++abi.dylib: terminating with uncaught exception of type NSException。 - Michael Garito
1
在11.4上没有任何问题。 - Baran Emre

13

您正在创建一个新的活动指示器视图,这是可以的,但您没有引用状态栏中的活动指示器。

要在状态栏中显示活动指示器,只需调用此函数:

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

5
我想在导航栏上显示活动指示器。 - Warrior
我需要Warrior的解决方案,因为我正在隐藏状态栏。当然,你的解决方案也没有任何问题! - Andrew Duncan

5

Swift

  1. Connect UIBarButtonItem from storyboard to yourViewController
  2. remove week from its definition like: @IBOutlet var btNavigaitonRight: UIBarButtonItem!
  3. Use these methods for start and stopping activity indicator:

    var activityIndicator = UIActivityIndicatorView()
    
    func startBarButtonIndicator() {
        activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        activityIndicator?.color = .gray
        let barButton = UIBarButtonItem(customView: activityIndicator!)
        self.navigationItem.setRightBarButton(barButton, animated: true)
        activityIndicator?.startAnimating()
    }
    
    func stopBarButtonIndicator() {
        activityIndicator?.stopAnimating()
        navigationItem.setRightBarButton(btNavigaitonRight, animated: true)
    }
    

5
在Storyboard中:在导航栏上创建BarButtonItem。 将View作为你的BarButtonItem的子视图,并将ActivityIndicator作为你的View的子视图。

是的,在StoryBoard上:拖动BarButtonItem到导航栏上,然后将UIView拖动为BarButtonItem的子视图,最后将ActivityIndicator拖动为UIView的子视图。 - evya

3

像WhatsApp一样:

//声明

let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)

//ViewDidLoad

self.activityIndicator.hidesWhenStopped = true

func showIndicator() {
    self.navigationItem.titleView = self.activityIndicator
    self.activityIndicator.isHidden = false
}

func hideIndicator() {
    self.navigationItem.titleView = nil
}

2

谢谢!我的指示器现在正常工作。

我将分享一个代码示例,以便更好地理解。

- (void)viewDidLoad

// custom button images
UIImage *customImage = [UIImage imageNamed:@"menu24"];
UIImage *customImage2 = [UIImage imageNamed:@"search24"];
UIImage *customImage3 = [UIImage imageNamed:@"back24"];

// These are linked in my story board to Navigation Item
[self customiseBarBtnItem:[self menu_button] 
    customImage:customImage selector:@selector(menuPressed:)];
[self customiseBarBtnItem:[self search_button] 
    customImage:customImage2 selector:@selector(searchPressed:)];
[self customiseBarBtnItem:[self backButton] 
    customImage:customImage3 selector:@selector(backPressed:)];

//initialize the activity indicator - as @antf comment suggests for ios7   
UIActivityIndicatorView *actInd=[[UIActivityIndicatorView alloc]                                      
     initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

//store it as a property on the view controller
self.activityIndicator = actInd;

// this sets up activity indicator    
UIBarButtonItem *progress_indicator = [[UIBarButtonItem alloc] 
     initWithCustomView:[self activityIndicator]];

// link custom buttons AND activity indicator in desired order to navigation bar
self.navigationItem.rightBarButtonItems =
    [NSArray arrayWithObjects:
         self.menu_button,
         self.search_button, 
         progress_indicator, 
         nil];

// 为了完整性 - 这是我如何以编程方式显示/隐藏后退按钮

if ( bShowBack == YES ) 
     self.navItemBar.leftBarButtonItem = self.backButton;
else 
     self.navItemBar.leftBarButtonItem = Nil;

// 我在使用UIWebView时,需要触发我的活动指示器,如下所示

  - (void)webViewDidStartLoad:(UIWebView *)webView
  {    
    [[self activityIndicator] startAnimating];
  }

  - (void)didFailLoadWithError:(UIWebView *)webView 
          didFailLoadWithError:(NSError *)error
  {    
     [[self activityIndicator] stopAnimating];
  }

  - (void)webViewDidFinishLoad:(UIWebView *) webView
  {
     [[self activityIndicator] stopAnimating];
  }

2
在Swift中,我做了以下操作:
启用:UIApplication.sharedApplication().networkActivityIndicatorVisible = true 禁用:UIApplication.sharedApplication().networkActivityIndicatorVisible = false

这个会显示在状态栏中。 - powerj1984
1
你没有错。我误读了 OP - 道歉。话虽如此,我在搜索如何解决在状态栏中显示网络活动指示器的问题时遇到了这篇帖子 - 希望我的答案仍然能为某些人提供帮助,即使不能解决 OP 的问题。 - djbp

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接