在swift 3中显示来自自定义单元格的警报

Posted

技术标签:

【中文标题】在swift 3中显示来自自定义单元格的警报【英文标题】:Display alert from custom cell in swift 3 【发布时间】:2017-05-31 08:15:28 【问题描述】:

我在listViewCell.swiftlistViewCell.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 中使用搜索栏过滤具有自定义单元格的 UITableView 的内容?

自定义单元格的刷新控制问题 - Swift 4 IOS 11

Swift:无法以编程方式编辑自定义表格单元格的属性

多个自定义 UITableViewCell 相互覆盖 Swift

在Swift中单击后修改tableview中的单元格内容