UIButton在Swift中抛出Thread1:EXC_BAD_ACCESS(代码= 1,地址0x ...)

时间:2014-06-19 01:50:45

标签: ios uibutton swift

我正在另一个与主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”,但有些东西会导致Thread 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文件中,Root View Controller是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

我的其他View Controller如下所示:

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行。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题而且我收到了与你相同的错误。我想在其他课程中创建一个按钮。我建议你阅读我的解决方案: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"类。然后,设置此类的属性值,而不是创建按钮。

答案 1 :(得分:0)

对于今后遇到此问题的任何人来说,通常可以将其调试回保留您要添加目标的类中的按钮。

尝试将按钮或目标类的声明移动到全局类,以便在处理视图后进行清理。

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

class ViewController: UIViewController, UITextViewDelegate, UIScrollViewDelegate {

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

}