【问题标题】:UIAlertController button delegates don't fire (in Modally Segue)UIAlertController 按钮委托不会触发(在 Modally Segue 中)
【发布时间】:2015-05-18 00:43:20
【问题描述】:

我正在使用带有两个按钮的非常基本的 UIAlertController 设置。

    var alert = UIAlertController(title: "Leave player?",
        message: "You will not be able to return to this routine after!",
        preferredStyle: .Alert)


    let cancelAction: UIAlertAction = UIAlertAction(title: "Continue", style: .Cancel) { action -> Void in
        println("here")
    }
    let deleteAction: UIAlertAction = UIAlertAction(title: "Leave", style: .Default) { action -> Void in
        println("here")
    }

    alert.addAction(cancelAction)
    alert.addAction(deleteAction)

    self.presentViewController(alert, animated: true, completion: nil)

此代码在同一个视图上工作,并带有来自程序不同部分的推送序列。结构在哪里:

(MainView) -push> (View1) -push> (View2) -push> (ThisView)

现在 AlertController 弹出窗口和按钮返回简单的文本输出。

但在以下情况下,AlertController 弹出但单击按钮不返回任何内容,我的断点永远不会触发或只是检查控制台的文本输出不返回任何内容。

(MainView) -modal> (ThisView)

当然,我尝试将第二种情况下的 segue 设置为 push segue,但它并没有改变任何东西。 所以为了正确起见,AlertController 确实会弹出,但按钮根本没有响应。我可以指定一个替代代表吗?

现在,我花了一整天的时间来做一些简单的工作。我已经尝试过大多数技巧,例如延迟或异步块。

现在我有点想尝试了。所以请有人告诉我我做错了什么:)

更新

在导航控制器中嵌入 MainView 将 segue 更改为 Push segue,使按钮按下响应.. 我可以考虑添加导航控制器来解决这个问题,但我想保留 Modal segue 的动画。 有什么想法吗?

临时解决方案

现在我将使用 push segue 和导航控制器来解决这个问题。它不是最佳的,因为这个视图应该表现为一个弹出窗口而不是像 segue 那样的推送,但它确实有效。

【问题讨论】:

  • 您能指定代码的声明位置吗?在 MainView 中还是在 ThisView 中?
  • 您能否发布更多代码/故事板,以便我们更好地了解显示此警报时发生的情况?
  • 代码在ThisView上声明,距离mainView只有1个segue。 ThisView 也可以从程序的不同部分访问,该部分之间有 x 数量的 push segues。在 ThisView 上,还有一个每秒滴答的计时器,但我禁用了它,并且大多数事情发生在那里,所以它不应该做任何事情。此外,我从程序的不同部分运行警报,viewdidload,viewdidappear 并在其中一个循环中(如果禁用计时器,它们会被禁用,你可能会要求禁用它)所以我的想法与模态 segue 构造有关。
  • 您在呈现警报时是否关闭了modal 视图控制器?
  • 不,但这将是按下离开按钮时的功能。但是这些按钮不会在模态视图之上注册。当我将其更改为推送(segue)并将其连接到导航控制器时,按钮会响应..

标签: ios swift uialertcontroller


【解决方案1】:

我无法从您列出的代码中看出太多,但我之前遇到过类似的问题,原因是某些东西在我预期之前被解除分配,因此从未收到它的消息。

我发现的最佳解决方案是启用 NSZombies。 Xcode 会告诉您何时将您的操作消息发送到已释放的实例。请参阅此答案以了解如何启用(使用 Xcode 4.1 或更高版本的方法): https://stackoverflow.com/a/5387006/2194039

如果您不想使用 NSZombies,请尝试将其放入您的每个 VC 或其他相关类中:

deinit {
    println("This instance is deallocating")
}

我知道这只是一个笼统的想法,没有什么具体的,但这之前对我有帮助。

【讨论】:

  • 感谢您的建议,但对我没有帮助。目前我把整个功能放在一边,直到有一个解决方案而不必使用 push segues。
  • 我不会投反对票,因为想法很好,但是一旦控制器被呈现或推送,它被系统强持有(保留),所以它不会释放警报控制器或其他那些。
【解决方案2】:

您是否尝试在单独的函数中设置操作,并调用该函数

喜欢这个

var alert = UIAlertController(title: "Leave player?", message: "You will not be able to return to this routine after!", preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "Continue", style: UIAlertActionStyle.Cancel, handler: {(alert : UIAlertAction!) in self.AlertContinue()}))

alert.addAction(UIAlertAction(title: "Leave", style: UIAlertActionStyle.Default, handler: {(alert : UIAlertAction!) in self.AlertLeave()}))

self.presentViewController(alert, animated: true, completion: nil)

然后像这样定义方法

func AlertContinue() {println("here")}
func AlertLeave() {println("here")}

【讨论】:

  • 感谢您的回复,但行为没有改变。就像点击事件根本没有注册..
  • 又想到了一件事,从故事板中,选择 (ThisView) 并转到属性检查器,并检查 Presentation 是否设置为全屏。另外,检查(MainView)属性,对于(定义上下文)复选标记,取消选中它并尝试
  • 两者都像你说的那样设置。我用一个可能的修复更新了我的问题描述,但如果可能的话,这不是我想要使用的:)
  • 如果不调用处理程序块,这究竟有什么帮助?为发布清酒而发布没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多