2016-05-03 4 views
1

Recherche autour de ne semblait pas fournir tout ce que j'ai compris tout de suite. J'essaie de faire un stupide écran de chargement «old skool» pour une application qui imprimera des instructions «DOS like».appels éléments de tableau avec un retard en utilisant dans swift - get erreur UIResponder

Mon code actuel ressemble à ceci, mais je reçois une erreur UIResponder, UIApplicationDelegate - EXE_BAD_ACCESS

J'ai essayé de copier à un nouveau projet, etc. obtenir toujours la même erreur.

code ci-dessous:

class ViewController: UIViewController { 

    @IBOutlet weak var loadingLBL: UILabel! 

    @IBOutlet weak var logoIMG: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     //fades logo image in 
     logoIMG.alpha = 0 
     UIView.animateWithDuration(5, animations: { 
      self.logoIMG.alpha = 1; 
     }) 

     //array for loading text 

     var loading = ["Loading please wait.......\n", "Registry , OK!\n", `"Available ram, 256k\n", "BIOS Load... OK\n", "Welcome" ]` 

     var i = 0 
     var str: String = "" 
     var timer = NSTimer() 

     //delay function for loading array text 

     func delayFunc() { 
      str += "\(loading[i])\n" 
      loadingLBL.text = str 
      if i == loading.count - 1 { 
       timer.invalidate() 
      } 
      i += 1 
     } 

     timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector(delayFunc()), userInfo: nil, repeats: true) 
    } 

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

Comme je l'ai mentionné, je reçois un accident et je ne sais pas ce que je l'ai fait mal.

Toute aide serait grandement appréciée.

+2

Pour savoir comment déboguer un accident, s'il vous plaît visitez http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1 – rmaddy

+1

Après apprendre à déboguer, mettre à jour votre question avec des détails spécifiques sur l'accident, y compris le message d'erreur complet et la ligne qui cause réellement l'erreur. – rmaddy

+1

Après avoir fait ce que @rmaddy recommandé. Je commencerais par supprimer vos variables ** timer **, ** i **, & ** str ** de votre viewDidLoad avec votre delayFunc. Tous ceux-ci devraient être au niveau de la classe ... aussi, votre paramètre de sélecteur de minuteurs devrait être #selector (ViewController.delayFunc) –

Répondre

0

Je pense que votre problème est que delayFunc() est en viewDidLoad, le sélecteur est à la recherche dans le viewController mais ne trouve pas la fonction (car il est en viewDidLoad)

Edit: Je n'étais pas 100% clair sur pourquoi le sélecteur ne peut pas trouver delayFunc quand il est dans viewDidLoad. Si vous déclarez une fonction dans le corps d'une autre fonction, sa durée de vie correspond au maximum à la durée de vie de sa fonction 'parent'. Ainsi, lorsque votre minuteur tente d'appeler delayFunc, la fonction delayFunc n'existe plus car viewDidLoad a terminé son exécution.

Essayez:

var i = 0 
var str: String = "" 
var timer = NSTimer() 

var loading = ["Loading please wait.......\n", "Registry , OK!\n", "Available ram, 256k\n", "BIOS Load... OK\n", "Welcome" ] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    //fades logo image in 
    logoIMG.alpha = 0 
    UIView.animateWithDuration(5, animations: { 
     self.logoIMG.alpha = 1; 
    }) 

    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "delayFunc", userInfo: nil, repeats: true) 
} 

func delayFunc() { 
    str += "\(loading[i])\n" 
    loadingLBL.text = str 
    if i == loading.count - 1 { 
     timer.invalidate() 
    } 
    i += 1 
} 

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