2016-10-31 9 views
1

次のView Controllerにsegueに問題があります。私は行とセクションでレルムデータを表示するテーブルビューを持っています。 追加ボタンを押すとコントローラが表示され、データを正しく保存できます。 セルを選択すると、同じビューコントローラに移動し、テキストフィールドに正しいデータを入力する必要があります。インデックスセクションと行のtableviewから正しいRealmオブジェクトを渡す際の問題

現時点では、最初のセクションのindexpath行のデータのみを選択できます。他のセクションから選択したセルは、最初のセクションのデータだけを表示します。

私は正しいセクションを取得するためにさまざまな方法を試しましたが、失敗しました。

私が間違っていることを誰かに教えてもらえますか?

私はxcode 7.3とレルム2.0.3を使用しています。

以下は私のテーブルビューのコードです。下の両方の答えはあなたに感謝

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) { 

} 

}

EDIT。

もう1つ質問があります - 連絡先が追加されたときにインデックスセクションのタイトルのみが表示されますが、連絡先の先頭からすべてのインデックスタイトルが右下に表示されます。これは可能ですか?

答えて

2

問題は、それがアイテムを取得し、それらをフィルタリングする必要がありますdidSelectRowAtIndexPath

let contact : ContactItem = items[indexPath.row] 

にここにあります。あなたは既にそれを行う方法がありますので、didSelectRowAtIndexPathもそれを使うべきです。

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

あなたは、おそらくあなたは2つの異なる場所で同じフィルタリングロジックを持っていないcellForRowAtIndexPathでそれを使用する必要があります。

+0

優れたおかげ。私はそれが前にそれを試みたが、私はそれを入力しなかったかもしれないと誓ったのかもしれません。私はちょうど私が混乱したように多くの異なる方法を試みたと思う。 – scooby

+0

さらに簡単な質問 - 現在、連絡先が追加されたときにのみインデックスセクションのタイトルが表示されますが、連絡先の先頭からすべてのインデックスタイトルが右下に表示されます。これは可能ですか? – scooby

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)") 
 
}

+0

うまく動作するような気分。私の2番目の質問と任意のアイデア? – scooby

+0

これは本当にうれしいです。そのコードがうまくいくなら、私に投票してください。 2番目の質問はどこですか?私はトップに他の質問はありません。 –

+0

最初の答えのコメントにあります。 – scooby

関連する問題