在swift 3中显示来自自定义单元格的警报
Posted
技术标签:
【中文标题】在swift 3中显示来自自定义单元格的警报【英文标题】:Display alert from custom cell in swift 3 【发布时间】:2017-05-31 08:15:28 【问题描述】:我在listViewCell.swift
和listViewCell.xib
中设计了自定义单元格。我在其中有文本字段。当用户输入超过 100 的数字时,我想显示警报。
我在 HomeViewController 中有 tableView。
let alert = UIAlertController(
title: "Error",
message: "Please Insert value less than 100",
preferredStyle: UIAlertControllerStyle.alert
)
alert.addAction(UIAlertAction(
title: "Click",
style: UIAlertActionStyle.default,
handler: nil
))
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true, completion: nil)
然后它给了我Attempt to present <UIAlertController: 0x7f945a5a67d0> on <ProjName.LoginController: 0x7f945a407e70> whose view is not in the window hierarchy!
当我将代码更改为
let alert = UIAlertController(
title: "Error", message: "Please Insert value less than 100",
preferredStyle: UIAlertControllerStyle.alert
)
alert.addAction(UIAlertAction(
title: "Click",
style: UIAlertActionStyle.default,
handler: nil
))
HomeViewController().present(alert, animated: true, completion: nil)
然后它给了我unexpectedly found nil while unwrapping an Optional value
并指向
override func viewDidLoad()
super.viewDidLoad()
**tableViewList.delegate = self**
tableViewList.dataSource = self
searchBar.delegate = self
如何显示来自自定义单元格的警报?或者我们如何在 HomeViewController 中创建一个通用的警报函数并将其显示在任何 swift 文件中?
提前致谢
【问题讨论】:
您在哪一行收到此错误? 你的 tableview 和 alert 是否在同一个 HomeController 上?如果是这样而不是 HomeViewController(),你为什么不试试 self.存在(警报,动画:真,完成:无)tableViewList.delegate = self
出现错误
【参考方案1】:
您可以制作自定义单元格的代表。将您的自定义单元格的代表设置为您的HomeViewController
,例如didEnterInvalidValue
didEnterValidValue
。从这些委托实现中,使用自定义消息显示您的 UIAlertController
。
或者您可以遍历您的 self.navigationController?.viewControllers
以找到顶视图控制器并在该视图控制器的视图上显示 UIAlertController
。
【讨论】:
我创建了一个名为 didEnterInvalidValue 的委托,在 tableView cellForRowAt 函数中添加了cell.didEnterInvalidValue = self as? customProtocol1
,在我编写的函数之外显示警报函数func displayAlert ( title: String) print("This line prints")
在外部类中我声明了自定义协议来调用函数protocol customProtocol1 func displayAlert(title: String)
在 listViewCell.swift 中我在类中添加了var didEnterInvalidValue: customProtocol1?
然后我在验证后调用didEnterInvalidValue?.displayAlert(title: "Error")
但仍然不执行 DisplayAlert 函数。你能帮我告诉我哪里出错了吗?我是 swift 新手
嗯,你需要先研究一下代表。通过此链接:code.tutsplus.com/tutorials/…【参考方案2】:
最简单的方法是
第 1 步:
在您使用自定义 Cell 的视图控制器中,为您的 textField 创建一个通用委托函数,其目的是通知您有关文本长度的信息。 您可能需要为此扩展 UITextFieldDelegate。
或者你可以为你的 textField 分配一个目标函数(但不确定它是否有效)
如何捕捉特定的 TextField?
您需要使用 indexPath 为每个 textField 分配一个标签,并使用该标签捕获特定的 textField。
第 2 步:
在该功能中,您可以仅使用来显示警报
self.present(alert, animated: true, completion: nil)
【讨论】:
【参考方案3】:我会去找代表的答案。但是为了更快的解决方案,在几个项目中,我从 AppDelegate 的 rootViewController(通常是 UINavigationController)创建了一个单例,以便它可以随时获取 rootController。使用 keyWindow,不是很推荐,因为 keyWindow 并不总是由谁控制,例如,alert dialog 重新定义它。
另一个项目我创建了一个 AlertClass 单音,它由 rootController 初始化,并且总是从它调用。
【讨论】:
以上是关于在swift 3中显示来自自定义单元格的警报的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用搜索栏过滤具有自定义单元格的 UITableView 的内容?
自定义单元格的刷新控制问题 - Swift 4 IOS 11