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...)的主要内容,如果未能解决你的问题,请参考以下文章