2016-01-21 41 views
20

Một trong các tab của tôi (trong ứng dụng Tab-Based) hoạt động trên iOS 9, nhưng không hoạt động trên iOS 8. Cụ thể, khi cố gắng tải dữ liệu từ plist, tôi nhận được lỗi hiển thị bên dưới.iOS Code Hoạt động trên iOS 9 chứ không phải trên iOS 8?

Tôi có tab "Công cụ lập kế hoạch" để lưu các mục nhập vào một danh sách. iOS 8 Lỗi - reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)'

Saving Code:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    plistPath = appDelegate.plistPathInDocument 
    plistPath2 = appDelegate.plist2PathInDocument 
    // Extract the content of the file as NSData 
    let data:NSData = NSFileManager.defaultManager().contentsAtPath(plistPath)! 
    let data2:NSData = NSFileManager.defaultManager().contentsAtPath(plistPath2)! 
    do{ 
     if(numOfViewWillAppear == 0) 
     { 
      if let x = NSKeyedUnarchiver.unarchiveObjectWithData(data2) 
      { 
       self.sortedSections = NSKeyedUnarchiver.unarchiveObjectWithData(data2) as! [String] 
       self.sections = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! Dictionary 
      } 
      numOfViewWillAppear++ 
     } 
    } 

Và mã chuẩn bị appdelegate:

func preparePlist() 
{ 
    let rootPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0] 
    let url = NSURL(string: rootPath) 
    plistPathInDocument = (url?.URLByAppendingPathComponent("planner.plist").path)! 

    if !NSFileManager.defaultManager().fileExistsAtPath(plistPathInDocument){ 
     let plistPathInBundle = NSBundle.mainBundle().pathForResource("planner", ofType: "plist")! 
     do { 
      try NSFileManager.defaultManager().copyItemAtPath(plistPathInBundle, toPath: plistPathInDocument) 
      print("plist copied") 
     } 
     catch{ 
      print("error copying plist!") 
     } 
    } 
    else{ 
     print("plst exists \(plistPathInDocument)") 
    } 

} 

Mã trong đó tôi tiết kiệm mục vào plist:

self.sections[todoItem.dueDate] = [Assignment(name: todoItem.name, dueDate: todoItem.dueDate)] 
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
plistPath = appDelegate.plistPathInDocument 
do{ 
    let sectionsData = NSKeyedArchiver.archivedDataWithRootObject(sections) 
    sectionsData.writeToFile(plistPath, atomically: true) 
} 
+0

Đảm bảo bạn đang sử dụng NSKeyedArchiver để lưu trữ. Và kiểm tra trước khi lưu trữ nếu dữ liệu là không. –

+1

Vui lòng chia sẻ tệp planner.plist. –

+1

Bạn có sử dụng tệp plist mặc định đi kèm trong ứng dụng của mình không? (Có vẻ như vậy, nhưng muốn xác nhận.) Bạn có thể hiển thị mã khi bạn lưu plist không? –

Trả lời

1

tôi 'không chắc chắn nó sẽ giúp nhưng nó có giá trị một thử:

self.sections = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! Dictionary 

Trong "mã lưu" trong dòng được đề cập ở trên, hãy thử sử dụng NSDictionary thay vì Dictionary khi chạy trên iOS8. Tôi nghĩ rằng tôi đã đọc ở đâu đó, họ chỉ giới thiệu lớp học Dictionary khá gần đây. Tôi không chắc chắn về điều này và tôi là loại người mới khi nói đến iOS nhưng đáng để thử ... nó có thể hoạt động. Nếu nó hoạt động, chỉ cần đặt đường dây Dictionary trong điều kiện if #available(ios 9.0 *).

+0

Hi Ilan, tôi thực sự đã thử điều này, nhưng nó không bao giờ làm việc. Tôi đã có thể làm cho nó hoạt động bằng cách kiểm tra số lượng byte (trống từ điển chứa 42 byte). Đó là một giải pháp khủng khiếp, nhưng đã làm việc :) – dannybess

+0

Đó là một giải pháp khá. vui vì nó làm việc cho bạn! –

Các vấn đề liên quan