SWIFT:尝试在tableView中显示复选标记时出现数组不匹配问题

时间:2015-11-18 00:27:09

标签: ios swift uitableview

这似乎是一个相当独特的问题,我希望有人可以提供一些见解或潜在的解决方案。我正在尝试为婚礼创建一个RSVP应用程序。目前,当客人登录并访问RSVP屏幕时,会向他们出示每个活动的受邀家庭成员(见下文):

enter image description here

您在上面的屏幕截图中看到的复选标记是手动输入的(即未从数据库中检索)。我正在尝试检索每个邀请(或不邀请)的每个活动的每个事件的真/假值,如果邀请了访客,则在其名称旁边放置一个复选标记。以下是Parse数据库的屏幕截图 -

enter image description here

使用“objectArray” -

在tableView中填充了每个事件的来宾名称

enter image description here

这是我从(\ event)RSVP数据库中检索的内容,并将其存储在“checked”数组中:

enter image description here

基本上,前四个值是“Guest 1”,接下来的四个是“Guest 2”等,这导致为错误的guest虚拟机显示一个复选标记(两个数组似乎不匹配 - 一个对键进行排序:事件上的值,另一个是每个来宾RSVP状态的有序列表)。

我认为这里有两种可能的解决方案: 1)以与“objectArray”相同的顺序创建“checked”数组 2)找到一种在cellForRowAtIndexPath

中的正确行中显示复选标记的方法

如果任何人都可以提供简单的解决方案或解释,那将非常有帮助。谢谢!以下是我的代码:

import UIKit
import Parse

class RSVPTableViewController: UITableViewController {

var checked = [Bool]()
var guestList = [String : [String]]()
let eventList = ["Hindu", "Reception", "Sangeet", "Tibetan"]

struct Objects {

    var sectionName : String!
    var sectionObjects : [String]!
}

var objectArray = [Objects]()

override func viewDidLoad() {
    super.viewDidLoad()

    for event in eventList { guestList[event] = [String]() }

    let query = PFQuery(className:"GuestList")
    query.whereKey("Family", equalTo: "Family1")

    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in

        if error == nil {

            if let family = objects {

                for guest in family {

                    for event in self.eventList {

                        if let RSVP = guest.valueForKey("\(event)RSVP") as? Bool {

                            self.checked.append(guest.valueForKey("\(event)RSVP") as! Bool)

                        }

                        if let invited = guest.valueForKey("\(event)Invite") as? Bool {

                            if invited {
                            self.guestList[event]!.append(guest.valueForKey("GuestName") as! String)

                            }
                        }
                    }
                }

                for (key, value) in self.guestList {
                    self.objectArray.append(Objects(sectionName: key, sectionObjects: value))
                }

                //Reload Table View!
                self.tableView.reloadData()
                print(self.checked)
                print(self.objectArray)

            }
        } else {
            print(error)
        }

    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return objectArray.count
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return objectArray[section].sectionObjects.count
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

    return objectArray[section].sectionName
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

    /*

    Check Mark Code Required

    */

    cell.textLabel?.text = objectArray[indexPath.section].sectionObjects[indexPath.row]

    return cell

}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    if let cell = tableView.cellForRowAtIndexPath(indexPath) {

        /*

        Check Mark Code Required

        */
        cell.accessoryType = .Checkmark

    }
}
}

UPDATE:根据Parse中的值,“Sangeet”列是唯一具有“true”值的列,这意味着表中“Sangeet”部分下列出的来宾应该有复选标记(没有其他人)。

enter image description here

1 个答案:

答案 0 :(得分:0)

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

    if self.checked[indexPath.section*tableView.numberOfSections+indexPath.row]{
       cell.accessoryType = .Checkmark
    }else{
       cell.accessoryType = .None
    }
    cell.textLabel?.text = objectArray[indexPath.section].sectionObjects[indexPath.row]

    return cell

}