0

В основном каждый раз, когда я закрываю и снова открываю приложение, он падает при открытии вкладки «История». Я уверен, что это связано с тем, как я использую NSUserDefaults. Может ли кто-нибудь провести меня?Сбой приложений после повторного открытия

Я заметил, что иногда он открывает вкладку «История» после повторного открытия, но если я добавлю новую запись в Nsuserdefaults, она сработает, после того, как я ее снова открою, она будет работать нормально и покажет предыдущую запись, или она удалит все и сохраните только новую запись.

// 
    // SecondViewController.swift 
    // Angelina 
    // 
    // Created by Artiom Sobol on 1/3/16. 
    // Copyright © 2016 Artiom Sobol. All rights reserved. 
    // 

    import UIKit 

    class History: UIViewController, UITableViewDataSource, UITableViewDelegate 
    { 
     // test variable 
     var test: MyHistory! 
     // array to store unarchived history 
     var newHistory = [MyHistory]() 

     //outlet for tableview 

     let defaults = NSUserDefaults.standardUserDefaults() 

     @IBOutlet var tableView: UITableView! 

     override func viewDidLoad() 
     { 

      //change the background 
      self.view.backgroundColor = UIColor(patternImage: UIImage(named: "newBackground.jpg")!) 
      super.viewDidLoad() 


      if let savedPeople = defaults.objectForKey("MyHistory") as? NSData { 
       newHistory = NSKeyedUnarchiver.unarchiveObjectWithData(savedPeople) as! [MyHistory] 
      } 
      tableView.delegate = self 
      tableView.dataSource = self 
     } 

     override func viewDidAppear(animated: Bool) { 
      super.viewDidAppear(animated) 
      tableView.reloadData() 
     } 


     func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int 
     { 
      return self.newHistory.count 
     } 

     func numberOfSectionsInTableView(tableView: UITableView) -> Int 
     { 
      return 1 
     } 

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
     { 

      let cell = tableView.dequeueReusableCellWithIdentifier("historyCell", forIndexPath: indexPath) as! historyCell 
      let person = newHistory[indexPath.item] 
      // let defaults2 = NSUserDefaults.standardUserDefaults() 

      print("This is count", newHistory.count) 

      // if let savedPeople = defaults.objectForKey("MyHistory") as? NSData { 
     //  newHistory = //NSKeyedUnarchiver.unarchiveObjectWithData(savedPeople) as! [MyHistory] 
//   } 



      // cell.durationLabel.text = String(person.durationNumber) 
      let (hour,minutes,seconds) = secondsToHoursMinutesSeconds(person.durationNumber) 

      if(seconds < 10 && minutes < 10) 
      { 
       cell.durationLabel.text = "0\(hour):0\(minutes):0\(seconds)" 
      } 
      else if(seconds > 9 && minutes < 10) 
      { 
       cell.durationLabel.text = "0\(hour):0\(minutes):\(seconds)" 
      } 
      else if(seconds > 9 && minutes > 9) 
      { 
       cell.durationLabel.text = "0\(hour):\(minutes):\(seconds)" 
      } 
      else if(seconds < 10 && minutes > 9) 
      { 
       cell.durationLabel.text = "0\(hour):\(minutes):0\(seconds)" 
      } 


      cell.kicksLabel.text = String(person.kicksNumber) 

      return cell 
     } 


     func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) 
     { 
      return (seconds/3600, (seconds % 3600)/60, (seconds % 3600) % 60) 
     } 


    } 

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

это мой другой файл, в котором происходит спасение массива.

import UIKit 
class Kicks: UIViewController 
{ 
    var count = 0 as Int 
    var countKicks = 0 as Int 
    var kickReached = false as Bool 
    var pressedOnce = true as Bool 
    var timer = NSTimer() 
    var test: MyHistory! 
    var dateString = " " 

    @IBOutlet var timerLabel: UITextField! 
    @IBOutlet var kicksLabel: UITextField! 

    @IBOutlet var dateDisplay: UITextField! 

    @IBOutlet var kickbutton: UIButton! 

    var myHistoryArray: [MyHistory] = [] 
    var currentMyHistory: MyHistory! 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     self.printTimestamp() 
     // Do any additional setup after loading the view, typically from a nib. 
     self.view.backgroundColor = UIColor(patternImage: UIImage(named: "background13.png")!) 
    } 

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

     @IBAction func kickButton() 
    { 

     //currentMyHistory.kicksNumber = 5 
     kickbutton.setImage(UIImage(named: "gold-button-heart-icon.png"), forState: UIControlState.Normal) 


     if(pressedOnce == true) 
     { 
      pressedOnce = false 
      timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("counter"), userInfo: nil, repeats: true) 
     } 
     else if(kickReached == true) 
     { 

      // let date = NSDate() 
      // let calendar = NSCalendar.currentCalendar() 
      // let timer_total = calendar.components([ .Hour, .Minute, .Second], fromDate: date) 

     } 
     else if(pressedOnce == false) 
     { 
      countKicks++ 
      kicksLabel.text = "\(countKicks)" 
      if(countKicks == 10) 
      { 
       self.printTimestamp() 
       kickReached = true 
       timer.invalidate() 
       kickbutton.setImage(UIImage(named: "pink-button-heart-icon.png"), forState: UIControlState.Normal) 
       congratsAlert() 

       currentMyHistory = MyHistory(kicksNumber: countKicks, durationNumber: count) 

       myHistoryArray.append(currentMyHistory) 


       test = myHistoryArray[0] 

       print("countof array ", myHistoryArray.count) 

       printTimestamp() // Prints "Sep 9, 2014, 4:30 AM" 

       //save data 
       let savedData = NSKeyedArchiver.archivedDataWithRootObject(myHistoryArray) 
       let defaults = NSUserDefaults.standardUserDefaults() 
       defaults.setObject(savedData, forKey: "MyHistory") 
       clear() 

      } 
     } 

    } 

    func printTimestamp() { 
     let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle) 
     print(timestamp) 
     dateDisplay.text = "\(timestamp)" 
    } 



    // save countKicks, count, and stamp i 
    func congratsAlert() 
    { 
     let alert = UIAlertController(title: "Congratulation", message: "Yay!!! Angelina kicked 10 times in less than 2 hours.",preferredStyle: .Alert) 

     let okAction = UIAlertAction(title: "Ok",style: .Default,handler:{(action:UIAlertAction) -> Void in}) 
     alert.addAction(okAction) 

     presentViewController(alert,animated: true,completion: nil) 
    } 

    func clear() 
    { 
     count = 0 
     countKicks = 0 
     kickReached = false 
     pressedOnce = true 
     timerLabel.text = "00:00:0\(count)" 
     kicksLabel.text = "\(countKicks)" 
    } 

    func counter() 
    { 
     ++count 
     let (hour,minutes,seconds) = secondsToHoursMinutesSeconds(count) 

     if(seconds < 10 && minutes < 10) 
     { 
      timerLabel.text = "0\(hour):0\(minutes):0\(seconds)" 
     } 
     else if(seconds > 9 && minutes < 10) 
     { 
      timerLabel.text = "0\(hour):0\(minutes):\(seconds)" 
     } 
     else if(seconds > 9 && minutes > 9) 
     { 
      timerLabel.text = "0\(hour):\(minutes):\(seconds)" 
     } 
     else if(seconds < 10 && minutes > 9) 
     { 
      timerLabel.text = "0\(hour):\(minutes):0\(seconds)" 
     } 
    } 

    func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) 
    { 
     return (seconds/3600, (seconds % 3600)/60, (seconds % 3600) % 60) 
    } 

} 
+0

Опубликовать трассировку стека с вывода – pnavk

+0

Завершение приложения из-за неотображенного исключения «NSRangeException», причина: «*** - [__ NSArrayI objectAtIndex:]: индекс 1 за пределами границ [0 .. 0] ' *** Первый бросить стек вызовов: (0x181cd5900 0x181343f80 0x181bbbac4 0x1000feb5c 0x1000fdbd8 0x100112134 0x100062840 0x1000637a4 0x186d1931c 0x186d19484 0x186d087e8 0x186d1dfb0 0x186ab308c 0x1869c3778 0x1843d2b2c 0x1843cd738 0x1843cd5f8 0x1843ccc94 0x1843cc9dc 0x1869b9c78 0x181c8c588 0x181c8a32c 0x181c8a75c 0x181bb9680 0x1830c8088 0x186a30d90 0x1000617c4 0x18175a8b8) LibC++ abi.dylib: оканчивающиеся неперехваченного исключением типа NSException –

+0

countof array 6 24 января 2016, 14:33 countof array 1 –

ответ

1

Это ясно говорит:

'NSRangeException', причина: "*** - [__ NSArrayI objectAtIndex]: индекс 1 за пределами [0 .. 0]

Дважды проверьте ваш объекты массива, как newHistory имеет все элементы, когда приложение начинает

кажется

func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int 
    { 
     return self.newHistory.count 
    } 

self.newHistory.count не 0, поэтому он запустит cellForRowAtIndexPath, попробуйте добавить две точки разрыва внутри numberOfRowsInSection и cellForRowAtIndexPath, чтобы вы знали, что происходит не так. Обычно, если нет данных, numberOfRowsInSection вернется 0 и cellForRowAtIndexPath не будет запущен.

Вы также можете указать точку исключения В навигаторе Xcode BreakPoint, чтобы вы могли разбить любые исключения. Это простые навыки отладки, необходимые для освоения.

+0

, что проблема, после я перезапускаю свое приложение, оно теряет все данные. Я не могу понять, почему –

+0

Вы не сохраняете свои данные на диск? Вы должны все, когда запускаете приложение, повторно извлекаете данные, а затем обновляете свою ячейку. – Wingzero

+0

обновил мой quetsion, я увидел, что вы сохранили и попробуйте перезагрузить, но суть в том, какая функция пытается прочитать пустой массив. Вы должны добавить исключение bp или вручную добавить ваш bp для отладки, это должно быть очень легко решить – Wingzero