DYAlertController
DYAlertController 可用作 Apple 的 UIAlertController 的替代方案。它支持复选框、单选和多项选择以及图标。DYAlertController 还包含两种样式,即警报和动作表。点击操作和点击确定或取消按钮将触发您在动作项的处理程序或取消和确定按钮处理程序中定义的动作,类似于 UIAlertController。拉取框架并检查子文件夹中的示例项目。
从 2.0 版本开始,支持不带确定按钮的单个复选框。为此,版本 2.0 中必须更新初始化器。如果从早期版本更新,则需要更新 DYAlertController 初始化器。有关详细信息,请参阅下面的变更日志。
3.1 版本具有 对 iOS 13 暗模式的支持。在 DYAlertController 实例上调用 present() 函数以启动它。
安装
通过 Cocoapods 安装 DYAlertController。请将以下信息输入到您的 Podfile 中(请查阅页眉中的当前版本)
platform :ios, '8.0'
use_frameworks!
target '[Your app project title]' do
pod 'DYAlertController', '~> [version]'
end
确保将 DYAlertController 导入到您的视图控制器子类中
import DYAlertController
重要:在您第一次打开包含 DYAlertController 的 .xcworkspace 项目文件后,Xcode 编译器可能会显示错误(例如“没有找到模块 DYAlertController”)。我在尝试安装很多其他 Cocoapods 时遇到过这个问题。只需运行您的代码,错误就应该会消失。
或者,您可以拉取此框架并将 DYAlertController 文件夹复制到您的项目中。
功能
作为UIAlertController的替代方案,DYAlertController拥有以下附加功能
- 在标题视图上方添加图标图片
- 为操作添加图标图片
- 如果你添加了“确定”按钮(对于勾选项:none和.single是可选的),点击操作时不会关闭警报或操作表,而是切换勾选标记。您还可以设置控制器为多个勾选标记。
- 没有“确定”按钮操作,无法实现多个勾选标记,但单选勾选标记选项支持这一点(仅限最新版本)。
- 在操作项处理程序中更改“确定”按钮样式(常规、破坏性、禁用)
- 添加一个或多个文本字段
- 从两种背景效果视图样式中选择,如模糊和暗度
- 设置警报或操作表的自定义宽度(其高度将根据内容视图的子视图自动设置)
- 自定义颜色、字体、圆角半径等
使用方法
使用方法类似于UIAlertController。请参阅下面的示例。
代码示例:创建一个警告
let titleImage = UIImage(named: "shareIcon")
let alert = DYAlertController(style: .alert, title: "Doing stuff", titleIconImage: titleImage, message:"Select one option", cancelButtonTitle: "Cancel", checkmarks: .none, customFrameWidth:200, backgroundEffect: DYAlertController.EffectViewMode.blur)
alert.addAction(DYAlertAction(title: "Do stuff 1", style:.normal, iconImage: nil, setSelected: false, handler: { (alertAction) -> Void in
print("executing first action! selected: \(alertAction.selected)")
}))
alert.addAction(DYAlertAction(title: "Do stuff 2", style:.normal, iconImage: nil, setSelected: false, handler: { (alertAction) -> Void in
print("executing 2nd action! selected: \(alertAction.selected)")
}))
alert.addAction(DYAlertAction(title: "Beware!", style:.destructive, iconImage: nil, setSelected: true, handler: { (alertAction) -> Void in
print("executing 3rd action! selected: \(alertAction.selected)")
}))
alert.handleCancelAction = {
print("cancel tapped")
}
self.present(alert, animated: true, completion: nil)
添加文本字段
let textfield1 = UITextField()
textfield1.placeholder = "username"
textfield1.autocorrectionType = UITextAutocorrectionType.no
let textfield2 = UITextField()
textfield2.placeholder = "password"
textfield2.isSecureTextEntry = true
let textfield3 = UITextField()
textfield3.placeholder = "hostname"
textfield3.autocorrectionType = UITextAutocorrectionType.no
textfield1.delegate = self
textfield2.delegate = self
textfield3.delegate = self
alert.addTextField(textField: textfield1)
alert.addTextField(textField: textfield2)
alert.addTextField(textField: textfield3)
您可以像这样获取文本输入:alert.textFields[0].text等。请确保只将文本字段添加到警报中,而不要添加到操作表中——就像UIAlertController一样,如果在运行时尝试将文本字段添加到操作表中,您的应用会崩溃。
添加一个确定按钮操作
以下是如何添加确定按钮操作的示例:
alert.addOKButtonAction("OK", setDisabled: false, setDestructive: false) {
print("ok button tapped!")
}
您可以在初始时设置“确定”按钮为禁用或破坏状态(例如,如果用户在选择“确定”按钮之前需要首先更改选择)。按钮样式可以在操作处理程序中更改。为此,请在每个动作项闭包中调用changeOKButtonStateIfNeeded()函数。此函数实现了“确定”按钮状态更改的默认行为: (1)如果所有选项都被取消选中,则“确定”按钮被禁用;(2)如果选中的某些动作是破坏性的,则“确定”按钮设置为破坏性样式;(3)如果1和2都不成立,则状态被设置为正常。查看该函数的默认实现,并在需要时进行覆盖。
示例
let actionSheet = DYAlertController(style: .actionSheet, title: "Doing stuff", titleIconImage: titleImage, message:"Select one option", cancelButtonTitle: "Cancel", checkmarks: .single, customFrameWidth: nil, backgroundEffect:.dim)
actionSheet.addAction(DYAlertAction(title: "Option 1", style:.normal, iconImage: UIImage(named: "eyeIcon"), setSelected: true, handler: { (action) -> Void in
actionSheet.changeOKButtonStateIfNeeded() // see description above
print("action \(action.title) selected? : \(action.selected)")
}))
// ... add other actions here...
actionSheet.addOKButtonAction("OK", setDisabled: false) {
var selectedOptionIndex:Int?
// we had set checkmarks to single, so only one can be selected
for i in 0...actionSheet.alertActions.count-1 {
if actionSheet.alertActions[i].selected {
selectedOptionIndex = i
}
}
if let _ = selectedOptionIndex {
print("ok button tapped - option selected: \(actionSheet.alertActions[selectedOptionIndex!].title)")
} else {
print("no option was selected!")
// to play safe... but actually not possible because ok button set to disabled if no action selected
}
}
// ...
下载示例项目以获取更多详细信息和查看下面的GIF动画中的示例。
操作表示例
带有单个勾选的操作表
带有多个勾选的操作表
自定义
如果您打算在您的应用中创建多个具有相同字体和颜色的警告或操作表,您可以直接更改DYAlertSettings结构中的默认设置。或者,您可以通过更改结构实例中的属性来更改代码中的单个属性。例如
// create alert or action sheet first
// ...
alert.settings.contentViewCornerRadius = 2.0
alert.settings.titleTextColor = UIColor.secondaryLabel
这些更改仅覆写您当前DYAlertViewController实例的设置属性。查看DYAlertSettings.swift文件。
变更日志
版本 3.1.1
错误修复:如果没有“确定”按钮,动作闭包将仅在小部件消失后执行。
版本 3.1
为 iOS 13 配置支持暗黑模式。增加了适用于 SwiftUI 的 iOS 13 扩展,允许通过在实例上调用 present() 来直接启动 DYAlertController 实例。修复了错误。
版本 3.0.1
次要设置更新。无代码变更更新到 Swift 5.0。
版本 3.0
升更新为 Swift 4.2 语法。更改主要在“内部”进行 - 几乎完全是 Swift 4.2 中重命名的常量,例如 NSNotification.Name.UIResponder.keyboardWillShowNotification 更名为 UIResponder.keyboardWillShowNotification。本框架的公共函数和设置名称没有改变。
版本 2.1
发布于 2018-04-03
- 处理分支合并(来自 Volker Thieme 的请求):在 DYAlertController 关闭后,现在调用 ok 按钮和取消按钮处理程序。此外,增加了两个可覆盖的设置:actionSheetAnimationDuration 和 alertAnimationDuration。
- 对 UILabel 和 Constraints 进行了少量的更改。
版本 2.0.3
发布于 2017-11-13。进行了一些次要的用户界面改进。
版本 2.0.2
发布于 2017-09-21。修复了标签对齐错误和表格视图约束错误。更新设置到 Swift 4.0。没有进行主要版本变更,因为几乎没有代码需要为 Swift 4.0 进行更改。
版本 2.0.1
发布于 2017-04-30。
- 修复虫洞:当设置勾选框为无时,图像视图现在会在操作单元格中显示。
- 当设置勾选框为无时,图像视图将移至单元格的右端。
版本 2.0
发布于 2017-04-18。 注意:初始化器和 okButton 操作已更改,此版本与先前版本不兼容。
- 现在有 checkmarks 枚举:.none,.single 或 .multiple
- 现在可以将 ok 按钮设置为破坏性状态
- 添加了 "reactive" ok 按钮的默认实现 - 在每个动作的闭包中调用 changeOKbuttonStateNeeded()。请参阅上面的描述中的详细信息。
版本 1.0.6
发布于 2017-01-03。
- 将动作表的动画替换为具有阻尼效果的弹簧
版本 1.0.5
发布于 2017-01-03。
- 更新测试
版本 1.0.4
发布于 2016-11-23。
- 添加了测试功能(实验性)
版本 1.0.3
发布于 2016-11-22。
- 添加快速帮助文档(DYAlertSettings)
版本 1.0.2
发布于 2016-11-21。
- 添加快速帮助文档
版本 1.0.1
发布于 2016-11-18。
- 修复了在演示过程中方向改变时“跳起”的bug。
版本 1.0
发布于 2016-11-17。
- 添加了多个文本字段
版本 0.6
发布于 2016-11-16 切换到 Swift 3
许可证
MIT许可证 (MIT)
版权(c)2016 Dominik Butz
特此授予任何获得本软件及相关文档副本(以下简称“软件”)的人免费使用的权利,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或出售软件的副本,并且允许向软件提供的人做上述事宜,但需遵守以下条件:
上述版权声明和本许可声明应包括在软件的所有副本或主要部分中。
软件按“原样”提供,无论明示或暗示,均不提供任何形式的保证,包括但不限于适销性、特定用途适用性和非侵权性。在任何事件中,作者或版权持有人不应对索赔、损害或其他责任承担责任,无论责任产生于合同、侵权或其他原因,也不论责任产生于软件的使用或与此有关的使用。