2016-10-07 22 views
21

-Disclaimer-
Tôi rất mới phát triển iOS và Swift, nhưng tôi không đặc biệt mới đối với lập trình.
Cách đọc từ plist với ứng dụng Swift 3 iOS

Tôi có ứng dụng iOS cơ bản với Swift3 yếu tố trong đó.
Tôi đã tạo một tệp plist với một số mục tôi muốn đọc và hiển thị trong ứng dụng của mình. (Không cần quyền truy cập ghi)

Làm cách nào bạn có thể đọc giá trị cho khóa đã cho cho tệp plist đi kèm, trong Swift3?

Điều này có vẻ như là một câu hỏi rất đơn giản đối với tôi, nhưng một loạt tìm kiếm đang khiến tôi đặt câu hỏi về toàn bộ cách tiếp cận khái niệm của mình.

Mẹo hữu ích sẽ được đánh giá cao.

+0

thấy điều này http://rebeloper.com/read-write-plist-file-swift/ và http: // www. learncoredata.com/plist/ –

+0

Trang web của người nổi loạn được lưu ý ở trên là liên kết tới thư viện để xử lý những điều này.Nó có thể là tuyệt vời, tôi không biết, nhưng nó chắc chắn là một bài viết dài mô tả một quá trình phức tạp hơn nhiều so với quá trình này nên yêu cầu. Trang web thứ hai là liên kết đã chết đối với tôi vào ngày này. –

Trả lời

61

Tương tự như cách bạn đã thực hiện trong cú pháp Swift 2.3 hoặc thấp hơn, chỉ cần thay đổi.

if let path = Bundle.main.path(forResource: "fileName", ofType: "plist") { 

    //If your plist contain root as Array 
    if let array = NSArray(contentsOfFile: path) as? [[String: Any]] { 

    } 

    ////If your plist contain root as Dictionary 
    if let dic = NSDictionary(contentsOfFile: path) as? [String: Any] { 

    } 
} 

Lưu ý: Trong Swift nó là tốt hơn để sử dụng loại Array và từ điển generic Swift thay vì NSArrayNSDictionary.

Edit: Thay vì NSArray(contentsOfFile: path)NSDictionary(contentsOfFile:) chúng tôi cũng có thể sử dụng PropertyListSerialization.propertyList(from:) để đọc dữ liệu từ tập tin plist.

if let fileUrl = Bundle.main.url(forResource: "fileName", withExtension: "plist"), 
    let data = try? Data(contentsOf: fileUrl) { 
     if let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String: Any]] { // [String: Any] which ever it is 
      print(result) 
     } 
} 
+0

Cảm ơn rất nhiều. Tôi đã tìm thấy rất nhiều ví dụ cho Swift! = 3. Tôi lo ngại về việc áp dụng Swift như tôi cũng nghe nói rằng nó có hai redecorations khá lớn trong cuộc sống rất ngắn của nó. –

+8

@Doc Điều đáng lưu ý là một số plists được xác định trước. Đáng chú ý nhất, info.plist: '' 'static let BASE_URL = Bundle.main.infoDictionary! [" MY_BASE_URL "] as! String''' – Dilapidus

+2

Để nhấn mạnh điểm rất tốt của @Dilapidus, câu trả lời đúng/được chấp nhận cho câu hỏi này nên dựa trên 'Bundle.main.infoDictionary' ... nó ở ngay đó chờ bạn. Không cần thêm mã. – biomiker

2

Đây là một Swift 3 thực hiện, dựa trên Nirav D's answer:

/// Read Plist File. 
    /// 
    /// - Parameter fileURL: file URL. 
    /// - Returns: return plist content. 
    func ReadPlist(_ fileURL: URL) -> [String: Any]? { 
     guard fileURL.pathExtension == FileExtension.plist, let data = try? Data(contentsOf: fileURL) else { 
      return nil 
     } 
     guard let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] else { 
      return nil 
     } 
     print(result) 
     return result 
    } 
+2

Cảm ơn đề xuất mới. Bạn vui lòng hướng dẫn tôi cách điều này khác với câu trả lời của Nirav D không? Tôi thích rằng bạn có xử lý ngoại lệ liên quan. Đó có phải là cơ bản không? –

+1

@JamesTSnell Cảm ơn bạn đã đặt câu hỏi. Hai câu trả lời về cơ bản là giống nhau.Tôi chỉ tóm tắt câu trả lời của mình như một hàm để gọi dễ dàng. Câu trả lời của Nirav D không giải quyết được ngoại lệ hoặc điều gì đó sai trái. Vì vậy, trong chức năng của tôi, nếu một số điều xấu xảy ra sẽ trở lại không. Hy vọng được giúp đỡ. – Jerome

0

Đối Swift 3.0, sau mã trực tiếp nhắm mục tiêu để chìa khóa. Trong trường hợp đối tượng dict sẽ cung cấp mọi thứ sẽ có trong tệp plist của bạn.

if let path = Bundle.main.path(forResource: "YourPlistFile", ofType: "plist"), let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] { 
      let value = dict["KeyInYourPlistFile"] as! String 
    } 
0

Trong appdelegate tập

var bundlePath:String! 
    var documentPath:String! 
    var plistDocumentPath:URL! 
    let fileManager = FileManager() 


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    { 
     bundlePath = Bundle.main.path(forResource: "Team", ofType: "plist") 

     documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first 

     plistDocumentPath = URL.init(string: documentPath)?.appendingPathComponent("Team.plist") 
     print(plistDocumentPath.path) 

     if !fileManager.fileExists(atPath: plistDocumentPath.path){ 

      do { 
       try fileManager.copyItem(atPath: bundlePath, toPath: plistDocumentPath.path) 
      } catch { 
       print("error Occured \(error.localizedDescription)") 
      } 

     } 


     return true 
    } 

Trong ViewController

@IBOutlet weak var TeamTable: UITableView! 
    var appDelegate:AppDelegate! 
    var arrayForContacts:[[String:Any]]! // array object 


    override func viewDidLoad() { 
     super.viewDidLoad() 




     appDelegate = UIApplication.shared.delegate as! AppDelegate 


    } 
    override func viewWillAppear(_ animated: Bool) { 

     super.viewWillAppear(animated) 

     if appDelegate.fileManager.fileExists(atPath: appDelegate.plistDocumentPath.path){ 
      arrayForContacts = [] 
      if let contentOfPlist = NSArray.init(contentsOfFile: appDelegate.plistDocumentPath.path){ 
       arrayForContacts = contentOfPlist as! [[String:Any]] 
       TeamTable.reloadData() 
      } 

     } 
    } 
2

Dưới đây là ví dụ làm thế nào để có được BundleID từ Thông tin plist:

var appBundleID = "Unknown Bundle ID"  
if let bundleDict = Bundle.main.infoDictionary, 
    let bundleID = bundleDict[kCFBundleIdentifierKey as String] as? String { 
     appBundleID = bundleID 
    } 

Giống như cách bạn có thể dễ dàng truy cập vào bất kỳ khóa nào. Cách tiếp cận này là tốt cho các dự án nhiều mục tiêu.

0

Bạn cũng có thể đọc giá trị trực tiếp từ file plist của bạn bằng cách đơn giản

let value = Bundle.init(for: AppDelegate.self).infoDictionary?["your plist key name"] as? Any 
Các vấn đề liên quan