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

 手机用户2502929315 发布于 2023-01-09 13:10

我正在UITableViewSwift 开发一个基于小程序的应用程序.我开始硬编码一些基本数组(包括基本类声明和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有一个插座的内部,所有插座都连接到a 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:功能内部:

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中,在那些不存在(或者我没有遇到过)的文件中读取和使用plist时,似乎总是出现错误.

提前致谢,

-KodInc

1 个回答
  • 要解决您的初始问题,请将代码放在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>
    }
    

    2023-01-09 13:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有