iOS:调用POST API时Activity Indicator不显示问题求助
嘿,我来帮你捋捋这个问题~既然其他场景的加载器都正常,唯独这个POST方法(尤其是未输入内容时点击的场景)里导航栏的Indicator不显示,大概率是局部逻辑或者线程问题,咱们一步步排查:
1. 先确认:UI操作是不是在主线程执行?
网络请求肯定是在后台线程跑的,但UI更新必须在主线程!如果你的显示/隐藏Indicator的代码是放在网络请求的闭包里(后台线程),那Indicator根本不会显示。
举个正确的写法:
// 显示导航栏Indicator func showNavigationLoader() { DispatchQueue.main.async { let indicator = UIActivityIndicatorView(style: .medium) indicator.color = .black // 根据你的导航栏颜色调整,确保能看见 indicator.startAnimating() self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: indicator) } } // 隐藏导航栏Indicator func hideNavigationLoader() { DispatchQueue.main.async { // 恢复原来的导航栏按钮 self.navigationItem.rightBarButtonItem = self.originalRightBarButton } }
调用顺序要注意:先调用showNavigationLoader,再发起POST请求,请求完成(成功/失败)后再调用hideNavigationLoader。
2. 检查未输入内容场景的逻辑分支
你提到“未输入回复内容/消息时点击”的场景有问题,那要仔细看这个分支的代码:是不是在发起POST请求前,漏掉了显示Indicator的步骤?
比如错误的逻辑:
@IBAction func submitTapped(_ sender: UIButton) { let input = contentTextField.text ?? "" if input.isEmpty { // 直接发起请求,忘了显示加载器! callEmptyContentPOST() } else { showNavigationLoader() callNormalPOST(content: input) } }
改成正确的:
@IBAction func submitTapped(_ sender: UIButton) { let input = contentTextField.text ?? "" // 不管内容是否为空,先显示加载器 showNavigationLoader() if input.isEmpty { callEmptyContentPOST() } else { callNormalPOST(content: input) } }
3. 排查导航栏Indicator的引用/布局问题
如果是用Storyboard关联的IBOutlet,检查是不是在这个ViewController里,Indicator的关联断了?或者代码创建时,有没有正确添加到导航栏的BarButtonItem里?
另外,也可能是Indicator的颜色和导航栏背景色太接近,导致肉眼看不到!可以临时把Indicator的颜色改成对比强烈的(比如红色),测试下是不是真的没显示。
4. 会不会是请求完成太快,Indicator刚显示就被隐藏?
如果这个空内容的POST请求是本地校验或者响应极快,可能Indicator刚显示就被隐藏,你根本看不到。可以在hideNavigationLoader里加个延迟测试:
func hideNavigationLoader() { DispatchQueue.main.asyncAfter(deadline: .now() + 2) { // 延迟2秒隐藏 self.navigationItem.rightBarButtonItem = self.originalRightBarButton } }
如果这样能看到Indicator,那就是请求完成太快的问题,正常场景下可以保留原逻辑,或者根据需求调整。
内容的提问来源于stack exchange,提问作者Nikita Patil

