为啥dismissWithClickedButtonIndex 从来没有调用clickedButtonAtIndex?

Posted

技术标签:

【中文标题】为啥dismissWithClickedButtonIndex 从来没有调用clickedButtonAtIndex?【英文标题】:Why doesn't dismissWithClickedButtonIndex ever call clickedButtonAtIndex?为什么dismissWithClickedButtonIndex 从来没有调用clickedButtonAtIndex? 【发布时间】:2010-12-17 16:55:34 【问题描述】:

http://iphonedevelopment.blogspot.com/2009/02/alert-view-with-prompt.html

我正在使用该代码让我的 iPhone 应用程序显示一个包含 UITextField 和匹配的 CANCEL 和 OK 按钮的 alertView。

用户可以输入文本,点击 CANCEL 或 OK...,我会看到用户输入的文本...使用 clickedButtonAtIndex 方法中的代码。

这一切都有效,除了 1 件事:用户可能会在键盘上点击 DONE,而不是 OK。 我正在使用dismissWithClickedButtonIndex 来模拟​​OK 点击......但随后clickedButtonAtIndex 永远不会被调用。

dismissWithClickedButtonIndex 不应该也调用 clickedButtonAtIndex 吗?

我试图让 clickedButtonAtIndex 在 CANCEL、OK 或什至 DONE 被点击时被调用。

【问题讨论】:

【参考方案1】:

由于这是一个老问题,您现在可能已经想通了,但我对此感到非常沮丧,并且无法从 Google 获得任何帮助,因此对于将来遇到此问题的任何人:当您致电时dismissWithClickedbuttonIndex,被调用的方法是alertView:didDismissWithButtonIndex,而不是alertView:clickedButtonAtIndex。它的行为方式完全相同,我不明白为什么它们会是两个不同的方法来执行看似相同的操作,但它确实存在。

【讨论】:

感谢这些行,奇怪的委托模式,dismissWithClickedButton 应该至少调用两个委托方法,一个来处理按钮点击,另一个来处理关闭警报。令人困惑,多余的不必要的复杂性【参考方案2】:

clickedButtonAtIndex 在用户实际点击按钮时被调用。单击该按钮可能会或可能不会关闭警报。标准的确定/取消按钮具有消除点击警报的效果。如果单击转换为关闭或调用 dismissWithClickedbuttonIndex 方法,则是否调用了 DismissWithButtonIndex

【讨论】:

确实如此,但从委托模式的角度来看,这没有任何意义。这意味着 alertViewClickedButtonAtIndex 有时被称为按钮被按下,而不是像委托方法所建议的那样总是如此。它是否关闭警报是另一个问题,现在这是 didDismissWithButtonClicked 的责任:【参考方案3】:

我不确定我是否完全理解你的问题,但这是我的尝试:

首先,您需要从示例中删除if (buttonIndex != [alertView cancelButtonIndex])。这应该适用于 OK 和 CANCEL 按钮。

要识别键盘的 DONE 键,请使用 UITextFieldDelegate 中的 - (BOOL)textFieldShouldReturn:(UITextField *)textField。在这里你可以调用[textField resignFirstResponder] 来关闭键盘。

另外,你在clickedButtonAtIndex做什么?您不能创建自己的方法并在需要时调用它吗?

【讨论】:

【参考方案4】:

我在 UIAlertView(Blocks) 类别中遇到了同样的问题 UIAlertView-Blocks

我的解决方案:UIAlertView(Blocks) -> MYAlertView : UIAlertView

有时方法:- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 被调用。有时它没有调用。

所以...我试图在许多来源中找到解决方案。然后我用完全相同的代码创建了 UIAlertView 的子类。我的问题就解决了。事实上,它使用起来有点困难。但不再有这种侵入性的错误。

【讨论】:

以上是关于为啥dismissWithClickedButtonIndex 从来没有调用clickedButtonAtIndex?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?