You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS:调用POST API时Activity Indicator不显示问题求助

导航栏Activity Indicator在特定POST方法中不显示的排查方案

嘿,我来帮你捋捋这个问题~既然其他场景的加载器都正常,唯独这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:17:08