31914


以下のソースでは、起動時に`itemes`にあるものがテーブルのセルに格納されます。  
ここに

[code]

    func addCell(){
        //データの追加と追加したデータを元にテーブルビューの更新をしたい
        objects.insert(NSDate(), at: 0)
        let indexPath = IndexPath(row: 0, section: 0)
        tableView.insertRows(at: [indexPath], with: .automatic)
    }
    
[/code]

のような，関数（これはそのまま`insertNewObject`ですが）をつくって追加したいのですが，objectsにデータが追加されても、実際のテーブルには反映されません。  
理想としては`insertNewObject`と`tableView(_ tableView: UITableView, cellForRowAt
indexPath: IndexPath) -> UITableViewCella`が走るような動作が出来るといいのでしょうか？

ここを参考にしても出来ません。  
<http://ameblo.jp/highcommunicate/entry-12059919502.html> より

[code]

        // セルに新しいデータを追加
        @IBAction func tapAdd(sender: AnyObject) {
            // myItemsに追加.
            myItems.addObject("タイトルNEW")
            // TableViewを再読み込み.
            tableView.reloadData()
        }
    
[/code]

そんて  
（`func insertNewObject(_ sender: Any)`や， `override func tableView(_ tableView:
UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCella`を参考にしたが、出来ないが，`tableView`に`add(+)`ボタンを配置し押下したときに上記二つが走る為）

どうしたら追加されるか，ご教授いただけないでしょうか。

よろしくお願いいたします。

[code]

    class MasterViewController: UITableViewController {
    
        var detailViewController: DetailViewController? = nil
        var objects = [Any]()
        var ccClass = custumClass()
    
        private let itemes = ["Sleepy", "Sneezy", "Bashful", "Happy",
                              "Doc", "Grumpy", "Dopey", "Thorin", "Dorin","Nori", "Ori",
                              "Balin", "Dwalin", "Fili", "Kili",
                              "Oin", "Gloin", "Bifur", "Bofur", "Bombur"
        ]
    
        let simpleTableIdentifier = "Cell"
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            self.navigationItem.leftBarButtonItem = self.editButtonItem
    
            let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:)))
            self.navigationItem.rightBarButtonItem = addButton
            if let split = self.splitViewController {
                let controllers = split.viewControllers
                self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
            }
        }
    
        func insertNewObject(_ sender: Any) {
            tableView.beginUpdates()
            objects.insert(NSDate(), at: 0)
            let indexPath = IndexPath(row: 0, section: 0)
            self.tableView.insertRows(at: [indexPath], with: .automatic)
            tableView.endUpdates()
        }
    
    ・・・略・・・
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell
                = tableView.dequeueReusableCell(withIdentifier: simpleTableIdentifier,
                                            for: indexPath) as UITableViewCell
            cell.textLabel?.text = itemes[indexPath.row]
            return cell
        }
    
    ・・・略・・・
    
    }
    
[/code]


CC BY-SA 3.0
2017-01-16T01:54:22.867
31875
2017-01-17T13:27:11.760
2017-01-17T13:25:54.387
10845
10845
question
swift swift3 ios10
TableViewのCellを任意のタイミングで追加したい


[UIKit - UITableView -
insertRows(at:with:)](https://developer.apple.com/reference/uikit/uitableview/1614879-insertrows)

こちらの _Discussion_ から引用します。

> When this method when is called in an animation block defined by the
> **beginUpdates()** and **endUpdates()** methods, UITableView defers any
> insertions of rows or sections until after it has handled the deletions of
> rows or sections.

この1行に従って、以下のようにコードを書き換えてください。

[code]

    func insertNewObject(_ sender: Any) {
        tableView.beginUpdates()
        objects.insert(NSDate(), at: 0)
        let indexPath = IndexPath(row: 0, section: 0)
        tableView.insertRows(at: [indexPath], with: .automatic)
        tableView.endUpdates()
    }
    
[/code]


CC BY-SA 3.0
2017-01-16T02:45:25.490
31877
2017-01-16T02:45:25.490
18540
31875
answer


結論:これは出来ないようです。この解決策が正しいのかはわかりませんが，期待通りの動作はしてくれる。  
したかったのはTableViewと入力の二つのviewをリンクしたかった（入力した後，登録操作でTableViewに追加）  
解決策として用いたのは，入力View側からNotificationのpostを行い，受け取ったタイミングで上記'addCell'を呼ぶとTableにCellが追加される。  
データの受け渡しにはAppDalegateを用いた。


CC BY-SA 3.0
2017-01-17T13:27:11.760
31914
2017-01-17T13:27:11.760
10845
31875
answer