如何阅读与Swift 3 iOS应用程序的plist
-Disclaimer-
我对iOS和Swift开发非常陌生,但我并不是特别不熟悉编程。
我有一个基本的iOS
应用程序,其中包含Swift3
元素。
我创build了一个plist
文件,其中包含一些我想要读取并显示在应用程序中的条目。 (不需要写入权限)
在Swift3中,如何读取捆绑plist
文件的给定键的值?
这对我来说似乎是一个非常简单的问题,但是一大堆search正在使我质疑我的整个概念方法。
有用的提示将不胜感激。
你在Swift 2.3或更低版本中完成的方法就是改变语法。
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] { } }
注意:在Swift中,最好使用Swift的genericstypesArray和Dictionary来代替NSArray
和NSDictionary
。
编辑:而不是NSArray(contentsOfFile: path)
和NSDictionary(contentsOfFile:)
我们也可以使用PropertyListSerialization.propertyList(from:)
从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) } }
这是一个Swift 3实现,基于Nirav D的回答 :
/// 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 }
对于Swift 3.0,直接定位到密钥的代码如下。 字典对象将在你的plist文件中提供所有的东西。
if let path = Bundle.main.path(forResource: "YourPlistFile", ofType: "plist"), let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] { let value = dict["KeyInYourPlistFile"] as! String }
在AppDelegate文件中
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 }
在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() } } }
以下是如何从Info plist获取BundleID的示例:
var appBundleID = "Unknown Bundle ID" if let bundleDict = Bundle.main.infoDictionary, let bundleID = bundleDict[kCFBundleIdentifierKey as String] as? String { appBundleID = bundleID }
用同样的方法你可以很容易地访问任何键。 这种方法对于许多目标项目是有益的。
- WhatsApp如何在iOS上encryption推送通知?
- 我可以让我的WatchKit应用程序在Apple Watch的后台运行吗?
- 如何在后台继续使用NSURLConnection开始连接?
- iOS OpenGL ES – 模拟器和设备上的不同纹理行为
- 如何通过iPhone中的graphicsAPI在Facebook上“喜欢”和“评论”?
- 自定义UIPickerView自定义背景颜色
- 如何在GMSMapView上设置自定义标注标记(点附近的animation环)
- 如何在Xcode 7和Swift 2中创build一个圆angular矩形标签
- 从互联网获取表格的数据时,任何人都可以用UItableview来解释MVC吗?