ios – Swift Plist读取和初始化数组作为键的对象

我正在 Swift开发一个小型的基于UITableView的应用程序.我开始硬编码一些基本的数组(包括基本的类声明和UITableView出口声明:
import UIKit

class ScenesViewController: UITableViewController {

@IBOutlet var myTableView: UITableView

var sceneName = ["Scene 1","Scene 2","Scene 3","Scene 4","Scene 5"]
var sceneDetail = ["Hi","Hello","Bye","My Bad","Happy"]

这个代码一个UITableViewController里面,它有一个插座,它连接到一个UITableView.我已经为这个称为“Scenes.plist”创建了一个plist,并试图替换代码.在Objective-C中,我会这样做:

Nsstring *path = [[NSBundle mainBundle] pathForResource:@"Scenes" ofType:@"plist"];

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
sceneName = [dict objectForKey:@"SceneName"];
sceneDetail = [dict objectForKey:@"SceneDetail"];

我开始在Swift这样做:

let path = NSBundle.mainBundle().pathForResource("Scenes",ofType:"plist")

let dict = NSDictionary(contentsOfFile:path)  // Error: 'ScenesViewController.Type' does not have a member named 'path'

我扫过互联网找到一个解决方案,但找不到一个.所以我采取了下一个行动方案 – “几乎”一线:

let dict = NSDictionary(contentsOfFile: 
    NSBundle.mainBundle().pathForResource("Scenes",ofType:"plist"))

var sceneName = dict["SceneName"] // Error: 'ScenesViewController.Type' does not have a member named 'dict'

现在,我几乎可以使用的唯一解决方案就是将所有这些都放在每个阵列的一行中:

var sceneName = NSDictionary(contentsOfFile: 
    NSBundle.mainBundle().pathForResource("Scenes",ofType:"plist").objectForKey("SceneName")
// Warning: Variable 'sceneName' inferred to have type 'AnyObject!',which may be unexpected
// Fix-It: Add an explicit type annotation to silence this warning (var sceneName: AnyObject! = ...)

所以我添加了显式类型注释,只是为了发现有更多的错误.在cellForRowAtIndexPath里面:function:

override func tableView(tableView: UITableView?,cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
    let cell: UITableViewCell = tableView!.dequeueReusableCellWithIdentifier("reuseIdentifier",forIndexPath: indexPath) as UITableViewCell

    // Configure the cell...

    cell.textLabel.text = sceneName[indexPath!.row] // Error: Could not find member 'row'
    return cell
}

实际上有两个错误;我不知道这是否意外重复.下一个错误在prepareForSegue:sender:方法中:

override func prepareForSegue(segue: UIStoryboardSegue?,sender: AnyObject?) {
    if segue?.identifier == "ShowDetails" {
        var detailVC: ScenesDetailViewController = segue!.destinationViewController as ScenesDetailViewController

        var myIndexPath: NSIndexPath = myTableView.indexPathForSelectedRow()

        var row: Int = myIndexPath.row

        detailVC.detailModal = [sceneDetail[row],sceneName[row]] // Error: Could not find an overload for 'subscript' that accepts the supplied arguments
    }
}

再次,有两个错误;但是,我相信这是因为sceneDetail和sceneName都被使用.在Objective-C中阅读和使用不存在的文件(或者我没有遇到的文件)中,似乎有错误.

提前致谢,

-kodinc

解决方法

解决你的初始问题,把代码放在一个func,像:
var memoryName = []
var memoryDetail = []

override func awakeFromNib() {
    super.awakeFromNib()

    let path = NSBundle.mainBundle().pathForResource("Memories",ofType:"plist")
    let dict = NSDictionary(contentsOfFile:path)

    memoryName = dict["MemoryName"] as Array<String>
    memoryDetail = dict["MemoryDetail"] as Array<String>
}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...