我遇到过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) {
}
}
编辑以下两个答案谢谢。
一个更快速的问题 - 目前它只显示添加联系人时的索引部分标题,但我希望从一开始就向下显示所有索引标题,他们是否有联系。这可能吗?
答案 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)")
}