Swift 使用数组修改 Tableviews

Posted

技术标签:

【中文标题】Swift 使用数组修改 Tableviews【英文标题】:Swift Modifying Tableviews with arrays 【发布时间】:2018-08-19 14:30:49 【问题描述】:

您好,我的个人项目快完成了,但是当我尝试使用数组修改表格视图时遇到了问题。 这是我正在使用的功能;它获取我拥有的数据并将其分别放入注释名称、注释坐标中,然后进入表格视图,所有这些都包含在自定义地图标注中。

我设置它的方式是使用 i 值,它会计数并完美匹配名称和坐标,如果我将 i 放入项目列表的“索引”中,它会通过计数它们来完全做到这一点。

我的问题是我希望能够在 tableview 中显示多行信息,这是使用“for _ in 0...1”。但是,当我结合 index=i 执行此操作时,我会得到 screenshot。

有人知道我将如何将 2 行信息放入每个池的 tableview 中吗?最终结果将具有正确的游泳池名称和位置(已经完成),然后是正确的相应地址和室内/室外描述。

我的代码如下,任何帮助将不胜感激我到处搜索但找不到任何有用的东西,不需要我重做所有事情。

func populatePoolsList() 
    let names = ["BSC Waltham", "Weston Golf Club", "BSC Wellesley", "Life Time Natick"]

    let coordinates = [
        CLLocationCoordinate2D(latitude: 42.400366, longitude: -71.279059),
        CLLocationCoordinate2D(latitude: 42.361025, longitude: -71.287842),
        CLLocationCoordinate2D(latitude: 42.348945, longitude: -71.228759),
        CLLocationCoordinate2D(latitude: 42.312967, longitude: -71.394940),
        ]
    let wishlist = ["444 Winter St, Indoor Pool", "275 Meadow*** Rd", "Outdoor Pool", "Someplace in Wellesley", "Both Infoor and Outdoor Pools", "a place in Natick", "Either pools"]
     let items = ["444 Winter St, Indoor Pool", "275 Meadow*** Rd", "Outdoor Pool", "Someplace in Wellesley", "Both Infoor and Outdoor Pools", "a place in Natick", "Either pools"]

    pools = []
    for i in 0..<kPoolsWishListManagerNumberOfPools 
        let name = names[i]
        let avatar = UIImage(named: "outdoorpool 2")!
        var wishlist = [String]()
        for _ in 0...1 
            let index = i
            wishlist.append(items[index])
        

        let pool = Pool(name: name, avatar: avatar)
        pool.wishList = wishlist
        pool.location = coordinates[i]
        pools.append(pool)
    
 

【问题讨论】:

在表格视图中,您是否尝试在第一行显示地址,在第二行显示位置类型? @Jackson.R 是的,这就是我想要的,但老实说,只要它们在正确的池注释中,我会在 tableview 中以任意顺序获取这两个信息,哈哈 【参考方案1】:

您的代码令人困惑,因为您有一个常量 wishlist 和后来的局部变量 wishlist,它们是不同的对象。

您将同一项目附加两次,因为您没有使用当前循环索引,而是使用最外层索引i

也许您的意思是在第一次迭代中使用项目 0 和 1,在第二次迭代中使用项目 2 和 3,依此类推。

let index = i * 2
wishlist = [items[index], items[index+1]]

这要求常量 wishlist 至少包含 kPoolsWishListManagerNumberOfPools * 2 项,否则会导致超出范围的崩溃。


如果数据是静态的,我建议扩展池初始化器

init(name: String, avatar: UIImage, coordinate: CLLocationCoordinate2D, wishlist : [String])

并以更有效的方式填充数组

func populatePoolsList() 
   pools = [Pool(name: "BSC Waltham", avatar: UIImage(named: "outdoorpool 2")!, coordinate: CLLocationCoordinate2D(latitude: 42.400366, longitude: -71.279059), wishlist : "444 Winter St, Indoor Pool", "275 Meadow*** Rd")
            Pool(name: "Weston Golf Club", avatar: UIImage(named: "outdoorpool 3")!, coordinate: CLLocationCoordinate2D(latitude: 42.361025, longitude: -71.287842), wishlist : "275 Meadow*** Rd", "Outdoor Pool",
            ... ]

或将数据保存在磁盘上的 JSON 文件中,并将 JSON 解码为 Pool 实例。

【讨论】:

您提出的功能适用于第一个注释(BSC Waltham),但我的主要问题是让后续注释(例如 BSC Wellesley)填充正确的信息。一般来说,我对编码和循环/索引很陌生,这就是为什么我的循环很混乱;最初我以为我必须使用“i”作为数组中每两个字符串的计数器,但现在我不确定这是否可能 非常感谢!我最终接受了您提出的第一个建议,因为在我看来,我个人更喜欢使用整数进行操作,而这更像是我正在寻找的快速解决方案【参考方案2】:

您的愿望清单值的分组不一致。尝试将愿望清单更改为:

let wishlist = ["444 Winter St, Indoor Pool",
                "275 Meadow*** Rd, Outdoor Pool",
                "Someplace in Wellesley, Both Infoor and Outdoor Pools",
                "a place in Natick, Either pools"]

【讨论】:

这是我尝试的第一件事,但它只是将地址和描述都放在同一行,并将下一个池信息放在第二行。

以上是关于Swift 使用数组修改 Tableviews的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中修改数组中对象的值

在迭代其范围时修改Swift数组 - 0到count,startIndex到endIndex

由于 swift 中的 for 循环而无法修改数组?

swift:修改字典中的数组

swift实现遍历嵌套字典并修改其中的值

swift实现遍历嵌套字典并修改其中的值