2015-05-20 3 views
0

Я неоднократно видел эту проблему в SO, но решения этих вопросов не исправили мою проблему.Ошибка UIButton (lldb) с EXC_BAD_ACCESS

Я динамически создаю UIButton и добавляю его в свой вид. Я добавляю цель к кнопке, которая является функцией.

Целевые функции выполняется (т.е. оператор тиражи), а затем я вижу ошибку (lldb) в консоли, а также за исключением точек останова высвечивает class AppDelegate: UIResponder, UIApplicationDelegate линия AppDelegate.swift с ошибкой EXC_BAD_ACCESS (code=1, address=x020000000c), и сбои приложений ,

Я знаю, что это обычно вызвано ошибками селектора (т. Е. Двоеточие, указывающее функцию приема параметров), но я пробовал все варианты двоеточий и no-colons, но безуспешно.

Любая помощь приветствуется

Источник:

import UIKit 

class ViewController: UIViewController { 

    var loginButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     self.loginButton = UIButton() 
     self.loginButton.frame = CGRectMake(10, 40, self.view.bounds.width - 20, 40) 
     self.loginButton.setTitle("Login", forState: UIControlState.Normal) 
     self.loginButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal) 

     self.view.addSubview(self.loginButton) 

     self.loginButton.addTarget(self, action: "initLogin:", forControlEvents:.TouchUpInside) 
    } 

    func initLogin(button: UIButton) 
    { 
     println("Logging in...") 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

Я принял соответствующий код из моего проекта и поместить его в пустой проект, сохраняется ошибка.

+1

Я знаю, это звучит глупо, но если поставить пробел между forControlEvents: .TouchUpInside? –

+0

@NekakKinich unfortunatley, что не проблема :) Я бы хотел, хотя! –

+0

Я знаю, но XCode и Swift очень особенные:/ –

ответ

2

Edit:

Похоже INIT специальное ключевое слово Swift использует при преодолении ObjC кода. Из документов:

Initialization

Чтобы создать экземпляр класса Objective-C в Swift, вы вызываете одну из своих инициализаторах с Swift синтаксисом. Когда методы инициализации Objective-C приходят в Swift, они берут собственный синтаксис инициализатора Swift. Приставка «INIT» получает отрезана и становится ключевым словом, чтобы указать, что метод является Initialize

Так что, если вы измените свой код на то, как показано ниже, он будет работать.

Благодаря @cedabob для справки: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26

class ViewController: UIViewController { 

     var loginButton: UIButton! 

     override func viewDidLoad() { 
      super.viewDidLoad() 
      // Do any additional setup after loading the view, typically from a nib. 

      self.loginButton = UIButton() 
      self.loginButton.frame = CGRectMake(10, 40, self.view.bounds.width - 20, 40) 
      self.loginButton.setTitle("Login", forState: UIControlState.Normal) 
      self.loginButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal) 

      self.view.addSubview(self.loginButton) 

      self.loginButton.addTarget(self, action: "login:", forControlEvents:.TouchUpInside) 
     } 

     func login(button: UIButton) 
     { 
      println("Logging in...") 
     } 

     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
     } 
    } 
+0

... к сожалению, это правильно. Не знаю, почему. Иногда Свифт иногда бесит. Спасибо за помощь! –

+0

Из быстрых документов: «Префикс« init »получает разрез и становится ключевым словом, указывающим, что метод является инициализатором». https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26 – chedabob

+0

Спасибо за ссылку @chedabob - отредактировал оригинальный ответ, чтобы включить – JamesSugrue