2017-04-13 7 views
0

私はSwift 3の初心者です。私はテーブルビューを持っており、ユーザーはテーブルビューセルを削除できます。今私は、ユーザーがセルの内容を変更できるようにしたい。私は4つの名前( "Stremmel"、 "Emma"、 "Sam"、 "Daisy")を含む配列を持っていて、ユーザはStremmelをGeorgeに編集することができるようにしたい。
私はそうする方法を考えるのに役立つような文書や似たような質問を探しましたが、私はもっと混乱しました。誰か私に助けを提供してもらえますか?ありがとうございました。ここに私のテーブルビューは以下のとおりです。Swift 3のテーブルセルの内容を編集する方法

import UIKit 
var list = ["Stremmel" , "Emma" , "Sam" , "Daisy"] 
class ViewController: UITableViewController { 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return list.count 
} 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    cell.textLabel?.text = list[indexPath.row] 
    return cell 
} 
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 

if editingStyle == UITableViewCellEditingStyle.delete 
{ 
    list.remove(at: indexPath.row) 
    tableView.reloadData() 
} 


} 

答えて

2

[編集]ボタンを[削除]ボタンとともに表示する場合は、commit editingStyleの代わりにcanEditRowAtメソッドを使用してeditActionsForRowAtメソッドを実装する必要があります。

その後、editActionsForRowAtと表示してとtextFieldを表示し、その値を更新して行をリロードします。したがってコードからcommit editingStyleメソッドを削除またはコメントし、以下の2つのメソッドを追加してください。

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return true 
} 

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in 
     let alert = UIAlertController(title: "", message: "Edit list item", preferredStyle: .alert) 
     alert.addTextField(configurationHandler: { (textField) in 
      textField.text = self.list[indexPath.row] 
     }) 
     alert.addAction(UIAlertAction(title: "Update", style: .default, handler: { (updateAction) in 
      self.list[indexPath.row] = alert.textFields!.first!.text! 
      self.tableView.reloadRows(at: [indexPath], with: .fade) 
     })) 
     alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     self.present(alert, animated: false) 
    }) 

    let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in 
     self.list.remove(at: indexPath.row) 
     tableView.reloadData() 
    }) 

    return [deleteAction, editAction] 
} 
+0

最初に何を意味するのか尋ねることはできますか? (self.list [indexPath.row] = alert.textFields!.first!.text!) –

+0

@ D.Moses AlertControllerには['textFields'](https://developer.apple.com/reference/uikit/uialertcontroller/)があります。 1620104-textfields)プロパティーには '[UItextField]'型があり、我々は 'textfields'配列の最初のプロパティーを使ってそれにアクセスしているので、警告のテキストフィールドが1つあります。 –

+1

これは非常に役に立ちます。ご清聴ありがとうございます。 –

0
通常

UITableViewController()クラスを作成するときに、あなたが(編集ボタンに含まれるべきである)編集ボタンおよび削除機能を提供し、いくつかのテンプレートコードを持っている必要があります!それをコメント解除するだけで、それからアクセスできるはずです!

または、単にviewDidLoad()関数でself.editButtonItem()を呼び出すことができます。

私の悪い英語のために申し訳ありません、私はあなたの質問に答えることを願っています!

+0

申し訳ありませんが、私はあなたの答えを理解していませんでしたが、あなたの助けに感謝します。 –

関連する問題