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

如何为指定UIAlertController设置numberOfLines而非全局生效?

仅为特定UIAlertController设置多行文本

我之前用这段代码解决了UIAlertController的文本截断问题:

UILabel.appearance(whenContainedInInstancesOf: [UIAlertController.self]).numberOfLines = 2

但这个设置会作用于所有UIAlertController,我只想给自己代码里创建的特定actionSheet弹窗(就是下面这段代码里的弹窗)设置numberOfLines=2,该怎么实现?

我的弹窗代码:

let sheet = UIAlertController(title: "Location", message: nil, preferredStyle: .actionSheet)
    
for data in locationListArr {
    let displayName = "\(data.locAddr1 ?? "") \(data.locAddr2 ?? "") \(data.locCity ?? "") \(data.locProv ?? "") \(data.locPC ?? "")".uppercased()
    
    let item = UIAlertAction(title: displayName, style: .default) { (action) in
        self.locID = data.locID
        self.locName = data.locName ?? ""
        self.locAddr1 = data.locAddr1 ?? ""
        self.locAddr2 = data.locAddr2 ?? ""
        self.locCity = data.locCity ?? ""
        self.locProv = data.locProv ?? ""
        self.locPC = data.locPC ?? ""
        
        self.locationBtn.setTitle(displayName, for: .normal)
    }
    sheet.addAction(item)
}

present(sheet, animated: true, completion: nil)

解决方案

方法1:自定义UIAlertController子类

通过子类化,只给特定子类设置全局外观,避免影响其他弹窗:

  1. 定义子类:
class MultiLineActionSheetController: UIAlertController {}
  1. 设置外观(建议在App启动时设置一次,比如AppDelegate的didFinishLaunchingWithOptions里):
UILabel.appearance(whenContainedInInstancesOf: [MultiLineActionSheetController.self]).numberOfLines = 2
  1. 用子类创建你的弹窗:
let sheet = MultiLineActionSheetController(title: "Location", message: nil, preferredStyle: .actionSheet)
// 后续添加action的逻辑保持不变

方法2:弹窗展示后遍历子视图修改

如果不想子类化,可以在弹窗present完成后,遍历其视图层级找到所有UILabel并修改行数:

修改present代码:

present(sheet, animated: true) {
    // 递归遍历子视图
    func updateLabels(in view: UIView) {
        for subview in view.subviews {
            if let label = subview as? UILabel {
                label.numberOfLines = 2
            }
            updateLabels(in: subview)
        }
    }
    updateLabels(in: sheet.view)
}

这种方法仅对当前弹窗生效,无需全局设置,唯一要注意的是苹果可能会调整UIAlertController的视图结构,但实际开发中稳定性较好。

方法3:给UIAlertController添加扩展方法

写一个扩展封装设置逻辑,方便复用:

extension UIAlertController {
    func setActionLabelsNumberOfLines(_ lines: Int) {
        func configureLabels(in view: UIView) {
            for subview in view.subviews {
                if let label = subview as? UILabel {
                    label.numberOfLines = lines
                }
                configureLabels(in: subview)
            }
        }
        self.view.layoutIfNeeded()
        configureLabels(in: self.view)
    }
}

使用时在present的completion里调用:

present(sheet, animated: true) {
    sheet.setActionLabelsNumberOfLines(2)
}

内容的提问来源于stack exchange,提问作者rubberchicken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:20