Swift:为UIAlertAction设置图片的代码问题咨询
你的代码问题分析与正确实现方案
咱们先拆解下你这段Swift代码里存在的几个问题:
- 图片变量未正确赋值:
zdjecieGlowne初始化为nil,你把它直接赋值给alert按钮的image属性,自然看不到任何图片——得先确保这个变量加载到了有效的UIImage实例才行。 - 私有API风险:直接用
setValue(_:forKey:)设置"image"是在访问UIAlertAction的私有属性,苹果App Store审核大概率会拒,而且iOS版本更新后可能直接失效,绝对不推荐这么干。 - 代码不完整:最后一行
alert.addAction(UIAlertActio...明显是截断了,这会导致语法错误,得补全这个action的初始化代码。 - 语法可以更简洁:
UIAlertControllerStyle.alert在Swift里可以简写为.alert,没必要写完整的枚举类型名。
合法实现带图片的UIAlert的两种常见场景
场景1:给Alert的操作按钮加图片
如果你的需求是给按钮添加上图片,分两种情况处理:
iOS 15+ 官方原生方案
从iOS 15开始,苹果给UIAlertAction加了带图片的初始化方法,完全合法,用起来也简单:
// 先确保图片能正常加载,这里假设你的图片在Assets里叫"logo" guard let actionImage = UIImage(named: "logo")?.withRenderingMode(.alwaysOriginal) else { print("图片加载失败,请检查图片名称或Assets配置") return } // 创建Alert控制器 let alert = UIAlertController(title: "MyTitle", message: "My Message Box", preferredStyle: .alert) // 直接创建带图片的操作按钮 let saveAction = UIAlertAction(title: "保存", image: actionImage, style: .default) { _ in // 这里写按钮点击后的逻辑,比如保存操作 } // 添加取消按钮 let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil) alert.addAction(saveAction) alert.addAction(cancelAction) // 弹出Alert present(alert, animated: true)
兼容iOS 15以下版本的方案
如果要适配旧版本iOS,可以通过富文本标题的方式给按钮加图片,这是合法的操作:
guard let actionImage = UIImage(named: "logo")?.withRenderingMode(.alwaysOriginal) else { print("图片加载失败") return } let alert = UIAlertController(title: "MyTitle", message: "My Message Box", preferredStyle: .alert) let saveAction = UIAlertAction(title: "", style: .default, handler: nil) // 用富文本把图片插入到标题前面 let attachment = NSTextAttachment() attachment.image = actionImage attachment.bounds = CGRect(x: 0, y: -4, width: 20, height: 20) // 调整图片位置和大小 let attributedTitle = NSAttributedString(attachment: attachment) + NSAttributedString(string: " 保存") saveAction.setValue(attributedTitle, forKey: "attributedTitle") alert.addAction(saveAction) alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: nil)) present(alert, animated: true)
场景2:在Alert的内容区域展示图片
如果你的需求是在Alert的主体部分(标题/消息下方)展示图片,而不是按钮上,可以给UIAlertController添加自定义子视图:
guard let mainImage = UIImage(named: "logo") else { print("图片加载失败") return } let alert = UIAlertController(title: "MyTitle", message: "My Message Box\n\n", preferredStyle: .alert) // 消息里加换行是为了给图片留出空间 // 创建图片视图并设置布局 let imageView = UIImageView(image: mainImage) imageView.contentMode = .scaleAspectFit imageView.translatesAutoresizingMaskIntoConstraints = false alert.view.addSubview(imageView) // 固定图片大小并居中 NSLayoutConstraint.activate([ imageView.widthAnchor.constraint(equalToConstant: 120), imageView.heightAnchor.constraint(equalToConstant: 120), imageView.centerXAnchor.constraint(equalTo: alert.view.centerXAnchor), imageView.topAnchor.constraint(equalTo: alert.view.topAnchor, constant: 90) // 根据标题高度调整这个值 ]) // 添加操作按钮 alert.addAction(UIAlertAction(title: "确认", style: .default, handler: nil)) alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: nil)) present(alert, animated: true)
最后再强调一遍:千万别用私有API(比如直接设置"image"键),不仅过不了审核,后续iOS版本更新还会导致代码崩溃。
内容的提问来源于stack exchange,提问作者Łukasz Betta
相关产品推荐
相关产品推荐

