如何根据 UIAlertController 中的 UITextField 禁用 UIAlertAction?

2024-02-09

我正在使用一个UIAlertController向用户呈现一个对话框以输入5 位 CRN。我想要Add按钮将被禁用,直到字段中有五位且仅有五位数字。UITextField.

用户界面如下所示:

以下是为以下内容设置的属性UIAlertController:

var alertController: UIAlertController!

var addAlertAction: UIAlertAction! {
    return UIAlertAction(title: "Add", style: .default)
}

这是我在中初始化它们的方法viewDidLoad method:

self.alertController = UIAlertController(title: "Add Class", message: "Input CRN", preferredStyle: .alert)
self.alertController.addAction(addAlertAction)
self.alertController.addAction(UIAlertAction(title: "Cancel", style: .destructive))
self.alertController.addTextField { (textField) in
    textField.delegate = self
    textField.keyboardType = .numberPad
}

这是我尝试使用以下方法禁用/启用按钮的方法UITextFieldDelegate method:

func textFieldDidEndEditing(_ textField: UITextField) {
    if ((textField.text?.characters.count)! == 5) {
        self.alertController.actions[0].isEnabled = true
    } else {
        self.alertController.actions[0].isEnabled = false
    }
}

但是,该按钮始终保持禁用(或启用)状态。它永远不会被启用。出了什么问题?


实现中的逻辑shouldChangeCharactersIn的委托方法UITextField。当文本字段的每个字符发生变化时,会触发此方法。 您可以在考虑范围参数的情况下构建逻辑。

这是完美运行的代码。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
    if ((range.location == 4 && range.length == 0) || (range.location == 5 && range.length == 1)) {
        self.alertController.actions[0].isEnabled = true
    }else{
        self.alertController.actions[0].isEnabled = false
    }

    return true;
}

测试成功于Swift 3, XCode 8 and iOS 10

希望有帮助。 快乐编码...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据 UIAlertController 中的 UITextField 禁用 UIAlertAction? 的相关文章

随机推荐

  • 查找函数调用的源代码行

    我构建了一个自定义日志记录实用程序 它显示日志消息和日期时间 我想在调用该函数的源代码中添加行号 有没有办法确定特定 javascript 函数被触发的 HTML 源代码的哪一行 编写了一个日志库 log4javascript http l
  • 如何防止ngInfiniteScroll在初次触发后被多次触发?

    我正在使用 ngInfiniteScroll 在我的网站上启用无限滚动 它部分地按预期工作 一旦我滚动到页面底部 它就会调用我希望它调用的方法来显示更多帖子 除了它在触发一次后不断调用帖子而没有结束 有谁知道这可能是什么原因造成的 这就是我
  • 我应该更新我的 npm 版本还是使用 node.js 提供的版本?

    我有一个使用 node js 14 16 0 的项目 我和我的团队成员都使用该版本 我使用 npm 6 14 11 我的团队成员使用 npm 7 x x 这会导致 package lock json 不同 这lockFileVersion我
  • 为什么我的 xcode 构建总是转到 iPad 模拟器而不是 iPhone 模拟器?

    我刚刚安装了 Apple 的最新 SDK 因此我可以开始学习 iPhone iPad 应用程序开发 然而 我遇到了一个愚蠢的问题 我的所有构建都在 iPad 模拟器而不是 iPhone 模拟器中运行 而且我不知道如何更改它 目前 iPhon
  • Excel 中用于 CSV 导入的相对路径

    我有一个 Excel 工作簿 可以自动更新 CSV 文件中的工作表 这些从硬编码文件夹 c temp premiumreports name of CSV file csv 中提取数据 此方法迫使我每次都将所有内容放入 c temp pre
  • 来自 ngFor angular2 的拼接元素

    我正在从后端请求位置列表并将其用于ngFor但是我想删除第一个数组元素 说我要删除Id 0所以在我看来不会这样li元素 这是我正在渲染并想要删除的列表数组StoreHouse Id 0 StoreLocation StoreHouse Id
  • ckeditor 不读取媒体嵌入代码

    我使用 ckeditor 的媒体嵌入插件 它工作正常 代码正确保存在数据库和 youtube soundcloud 等中 页面上播放器显示正常 但是 当用户进入他可以编辑信息的管理页面时 内部和带有标签的文本不会显示 因此当用户单击 保存
  • 指向零长度数组的指针的属性

    Consider int main auto a new int 0 delete a So there s no memory leak 在复制初始化和删除之间 是否允许读取指针a 1 此外 该语言是否允许编译器设置a to nullpt
  • 如何在 Azure API 管理中导入 swagger

    我看到一些文章和视频 其中导入了 Swagger 但随着新的 UI 更改 我无法找到导入 Swagger 的位置 在视频参考中 它显示在 WADL 或 Swagger 选项中 现在我看不到 Swagger 选项 这个选项被删除了吗 您可以使
  • 通过 MSBuild 构建 Visual Studio 2015 C++ 项目 (v140) 失败 - 找不到 v140

    我并排安装了 Visual Studio 2013 和 2015 我刚刚将组合解决方案 C C C CLI 升级到 2015 并将 Platform Toolset 设置为 v140 Visual Studio 中的构建工作正常 但无法从
  • 查询 XML 而忽略名称空间?

    我试图在忽略命名空间的同时查询 XML 因为结果集有多个命名空间 我已经到达 DataSets 节点 但我不知道如何获取多个 DataSourceName CommandType CommandText 理想情况下我想要 DataSetNa
  • 通过OData读取数据:如何通过curl/RCurl指定身份验证方案?

    我想通过 HTTPS 读取一些数据OData http www odata org 连接和数据源需要Basic认证方案 我很熟悉平常的curl http curl haxx se RCurl http cran r project org
  • 无法使用项目列表(数组)读取自定义事实

    我创建了自定义事实 gt etc ansible facts d hdfs fact 当我使用以下命令运行剧本时 debug var ansible local hdfs run once true 我如预期得到以下答案 PLAY all
  • 管理 Google 地图 API 密钥

    我的应用程序使用大量 MapView 屏幕 我正在尝试找出如何管理调试环境和生产环境之间的 API 密钥 显然 无法更改 Eclipse 中的调试应用程序密钥 因此我必须在该环境中使用调试映射 API 密钥 相反 如果没有生产应用程序密钥
  • AS3 处理任意大文件

    我正在尝试读取 AS3 中的一个非常大的文件 但我遇到了运行时崩溃的问题 我目前正在使用文件流 http help adobe com en US Flex 4 0 langref flash filesystem FileStream h
  • NHibernate.LazyInitializationException

    我们一直偶尔会出现这个问题 但现在我每次都可以重现它 我正在增加自定义论坛上的查看计数器 这会导致错误 NHibernate LazyInitializationException 未能延迟初始化集合 没有会话或会话被关闭 此错误发生在对象
  • 从 virtualenv 中启动 wsgi 应用程序作为 Linux 系统服务

    我目前正在 virtualenv 中开发一个 Bottle 应用程序 我打算使用 bjoern WSGI 服务器来提供它 但这可能并不重要 我还打算使用 lighty 或 nginx 反向代理来为应用程序提供服务 无论如何 应用程序可以作为
  • ECS任务如何知道在哪个区域运行?

    我有一个在 ECS 启动的任务中使用 boto3 的 python 应用程序 在 docker 容器中 我使用的 boto3 命令需要一个区域才能正常工作 但我只知道运行时的区域 多区域应用程序 当时的想法是定义AWS DEFAULT RE
  • 在 if 条件下改变字符串变量

    我使用这个程序将输入 mm 作为一年中的月份并打印出月份的名称 include
  • 如何根据 UIAlertController 中的 UITextField 禁用 UIAlertAction?

    我正在使用一个UIAlertController向用户呈现一个对话框以输入5 位 CRN 我想要Add按钮将被禁用 直到字段中有五位且仅有五位数字 UITextField 用户界面如下所示 以下是为以下内容设置的属性UIAlertContr