从tableview为索引部分和行

时间:2016-10-31 16:08:24

标签: ios iphone swift uitableview realm

我遇到过segue到下一个视图控制器的问题。我有一个tableview显示行和节中的领域数据。 如果我按下添加按钮,它会进入查看控制器并允许我输入数据并正确存储。 如果我选择单元格,它应该带我到同一个视图控制器并用正确的数据填充文本字段。

目前我只能选择第一部分索引路径行的数据。我从其他部分选择的每个单元格仍然只显示第一部分的数据。

我尝试了很多方法来获得正确的部分但失败了。

有人可以告诉我我做错了什么。

我正在使用xcode 7.3和realm 2.0.3。

以下是我的tableview中的代码。

class TableViewController: UITableViewController {

let items = try! Realm().objects(ContactItem).sorted(["Initial", "Name"])

var sectionNames: [String] {
    return Set(items.valueForKeyPath("Initial") as! [String]).sort()
}

//var sectionTitles = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

override func viewDidLoad() {
    super.viewDidLoad()
    setupUI()
    tableView.reloadData()
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}

func setupUI() {
    tableView.registerClass(Cell.self, forCellReuseIdentifier: "cell")
}

func items(forSection section: Int) -> Results<ContactItem> {
    return items.filter("Initial == %@", sectionNames[section])
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return sectionNames.count
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return sectionNames[section]
}

override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
    return items(forSection: section).count
}

override func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
    return sectionNames as [String]
}

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

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

    cell.textLabel?.text = items.filter("Initial == %@", sectionNames[indexPath.section])[indexPath.row].Name
    return cell
}

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

    let contact : ContactItem = items[indexPath.row]
    performSegueWithIdentifier("editContact", sender: contact)
    print("Selected row at \(indexPath.row)")
    print("Selected section at \(indexPath.section)")
}

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
 {
 if(segue.identifier == "editContact")
    {
    let viewController = segue.destinationViewController as! AddEntryViewController
    viewController.contact = sender as! ContactItem
    }

 }

@IBAction func addContact(sender: AnyObject) {

}

}

编辑以下两个答案谢谢。

一个更快速的问题 - 目前它只显示添加联系人时的索引部分标题,但我希望从一开始就向下显示所有索引标题,他们是否有联系。这可能吗?

2 个答案:

答案 0 :(得分:2)

问题出在didSelectRowAtIndexPath

let contact : ContactItem = items[indexPath.row]

它应该是获取项目并过滤它们。你已经有了这样做的方法,所以didSelectRowAtIndexPath也应该使用它。

let contact : ContactItem = items(forSection: indexPath.section)[indexPath.row]

您可能应该在cellForRowAtIndexPath中使用它,因此您在两个不同的地方没有相同的过滤逻辑。

答案 1 :(得分:0)

将didSelectRowAtIndexPath方法替换为此方法。

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

let contact: ContactItem = items.filter("Initial == %@", sectionNames[indexPath.section])[indexPath.row]
performSegueWithIdentifier("editContact", sender: contact)
print("Selected row at \(indexPath.row)")
print("Selected section at \(indexPath.section)")
}