UIButton 在 Swift 中抛出 Thread1: EXC_BAD_ACCESS (code=1, address 0x...)

Posted

技术标签:

【中文标题】UIButton 在 Swift 中抛出 Thread1: EXC_BAD_ACCESS (code=1, address 0x...)【英文标题】:UIButton throwing Thread1: EXC_BAD_ACCESS (code=1, address 0x...) in Swift 【发布时间】:2014-06-19 01:50:44 【问题描述】:

我在另一个与主 ViewController 相对的文件中创建一个 UIButton。我创建了这个按钮

var newNoteButton = UIButton(frame: CGRectMake(5, 18, 152.5, 37))
newNoteButton.backgroundColor = UIColor.grayColor()
newNoteButton.addTarget(self, action: ("newNoteButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside)
newNoteButton.setTitle("New Note", forState: UIControlState.Normal)
newNoteButton.userInteractionEnabled = true
self.view.addSubview(newNoteButton)

有动作

func newNoteButtonAction (sender: UIButton!)
    println("New Note")

即使我将相同的代码复制并粘贴到我的 ViewController 中,它也会引发上述错误,它根本不会标记我。为什么要这样做?这意味着只是打印出字符串“New Note”,但有些东西会导致线程 1 排队。

编辑: 经过一番阅读,我已经能够将代码量减少到这样:

    var newNoteButton = UIButton(frame: CGRectMake(5, 18, 152.5, 37))
    newNoteButton.backgroundColor = UIColor.grayColor()
    newNoteButton.addTarget(self, action: ("newNoteButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside)

还有这个:

func newNoteButtonAction (sender: UIButton!)
    println("New Note")

我尝试删除该操作,但问题仍然存在。这存在于我的 textView 类中的一个单独文件中。在我的 AppDelegate 文件中,根视图控制器是 ViewController。如果我将按钮移动到 ViewController,则问题不会出现。我的 ViewController 中唯一的代码是这个

import Foundation
import UIKit

class ViewController: UIViewController, UITextViewDelegate, UIScrollViewDelegate 

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

//Global Variables
var scrollView = UIScrollView()

override func viewDidLoad()
    super.viewDidLoad()

    //Add textView
    //let textViewRef = textView() Removed to test
    //self.view.addSubview(textViewRef.view)

    //Button Code
    var newNoteButton = UIButton(frame: CGRectMake(5, 18, 152.5, 37))
    newNoteButton.backgroundColor = UIColor.grayColor()
    newNoteButton.addTarget(self, action: ("newNoteButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside)
    self.view.addSubview(newNoteButton)



func newNoteButtonAction (sender: UIButton!)
    println("New Note")

我尝试在操作中使用条件句和分号,但这似乎不会影响它或以任何方式提供帮助。如果您需要更多信息,请随时询问。

编辑 2

我的另一个视图控制器是这样的:

import Foundation
import UIKit
class textView: UIViewController 
//Globals
var newNoteButton = UIButton()

override func viewDidLoad() 

    newNoteButton = UIButton(frame: CGRectMake(5, 18, 152.5, 37))
    newNoteButton.backgroundColor = UIColor.grayColor()
    newNoteButton.addTarget(self, action: ("newNoteButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside)
    self.view.addSubview(newNoteButton)



func newNoteButtonAction (sender: UIButton!)
    println("New Note")


编辑 3:我刚刚注意到此信息可能有点相关。错误出现在我的委托文件中的class AppDelegate 行。

【问题讨论】:

一切看起来都很好......看看这个***.com/questions/24102191/… @SamBudda 我遵守了。它可以在我的 ViewController 中完美运行,但不能在我的其他类中运行。 如果不是视图控制器,你的其他类是什么? self.view 是什么? 在哪里创建这个按钮并不重要。最有可能的按钮不是你的问题 @elito25 您发布了正在工作的视图控制器的代码……您能发布工作的视图控制器的代码吗?并描述它是如何呈现在视图上的?问题可能出在您的视图控制器上,而不是您的按钮上。 【参考方案1】:

我遇到了同样的问题,并且收到了与您相同的错误。我想在其他类中创建一个按钮。我建议您阅读我的解决方案:How invoke a method in the method addTarget of the Button class when I create programmatically the button in a plain class in Swift。一个抽象,你应该继承你需要的“UIClass”。如果你想创建一个按钮,你应该继承“UIButton”类。然后,你设置这个类的属性值,而不是创建一个按钮。

【讨论】:

【参考方案2】:

仅供以后遇到此问题的任何人参考,通常可以将其调试回您要添加目标的类中保留按钮。

尝试将按钮或目标类的声明移到一个全局类中,以便在视图被释放后进行清理。

示例:在上面列出的实例中,在类级别而不是在viewDidLoad 函数内声明newNoteButton,以确保它在可以调用它的目标时被保留。

class ViewController: UIViewController, UITextViewDelegate, UIScrollViewDelegate 

    // Global Variables
    var scrollView = UIScrollView()
    var newNoteButton: UIButton! // <- Declare button here instead of in viewDidLoad


【讨论】:

以上是关于UIButton 在 Swift 中抛出 Thread1: EXC_BAD_ACCESS (code=1, address 0x...)的主要内容,如果未能解决你的问题,请参考以下文章

调用可以抛出,但错误不能从全局变量初始化器中抛出

Swift 2:从类型的抛出函数到非抛出函数的无效转换

在构造函数中抛出 ArgumentNullException?

在 finally 块中抛出异常

在Scala中抛出异常,啥是“官方规则”

你能在 Java 中抛出啥?