web-dev-qa-db-ja.com

View Controller(Swift)を使用してtableviewをリロードする方法

私はこれにかなり新しいです。私はこのトピックに関するさまざまな質問を検討するために数時間を費やしましたが、私の質問に合う答えを見つけることができませんでした。

サブビューとしてtableviewを使用する(tableviewcontrollerではなく)viewcontrollerがあります。私の質問は、ビューコントローラーの:viewwillappearメソッド内でテーブルデータをリロードする方法です。メソッド内では、tableviewインスタンスに「アクセス」できません。 (私は私がtableviewcontrollerを使用していないのでreloaddata()を使用できないことも理解しています)。

簡単な解決策を知っていますか? (私はプロトコルがここで役立つと非常に思いますか?)

これは要するにコードです:

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var Person_data = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let tb: UITableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)

        tb.dataSource = self
        tb.delegate = self
        super.view.addSubview(tb)

        fetch_data()
    }


        func tableView(tableview: UITableView, numberOfRowsInSection section: Int) -> Int {
            let rows = Person_data.count
            return rows
        }


       func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
        {  
            let cell: UITableViewCell = UITableViewCell()
            cell.textLabel?.text = Person_data[indexPath.row].name
            return cell
        }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        fetch_data()      
      // reload at this point

    } 


    func fetch_data() {

       let tb_fetchRequest = NSFetchRequest(entityName: "Person")
        do {

            let tb_fetchResults = try my_moc.executeFetchRequest(tb_fetchRequest) as? [Person]
            Person_data = tb_fetchResults!
        } catch let error as NSError {
                print("request error: \(error)")
            }

        }
    }
7
Netzer

あなたの問題は、tbがローカル変数であるため、viewDidLoad()の外からは見えないということです。

tbをビューコントローラーのプロパティ(a.k.a.インスタンス変数)にすると、コントローラーのどのメソッドからでも使用できます。

_class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var Person_data = [Person]()

    private var tb: UITableView?  // Now the scope of tb is all of ViewController3...

    override func viewDidLoad() {
        super.viewDidLoad()

        // ...so it is visible here...

        tb = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)

        ...
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        fetch_data()      

        tb?.reloadData()   // ...and it is also visible here.
    } 
_

コードでは、tbがローカル変数であるということは、viewDidLoad()が終了したときにUITableViewオブジェクトが消えることを意味するわけではありません。それは、あなたのreferenceへのUITableViewが消えたことを意味します。テーブルビューオブジェクト自体は、ビュー階層に追加されているため存続しますが、変数がスコープ外になったため、参照できなくなりました。

変数とそれらが参照するオブジェクトの違いについてさらに読むには、「スコープ」と「参照渡し」を検索してください。

7
Paul Cantrell

tableViewIBOutletにはviewWillAppear:でアクセスできます。reloadDataを呼び出すこともできます。なぜできないと思うのかはわかりませんが、問題なく機能するはずです。

2
Charles A.

TableViewへのリンクを持つ変数を作成し、viewWillAppearの前に作成する必要があります。

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {
    private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
    var Person_data = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
        tableView.delegate = self
        super.view.addSubview(tb)

        fetch_data()
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        fetch_data()      
        tableView.reloadData()
    } 
}
1
Arsen
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {
    private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
    var Person_data = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
        tableView.delegate = self
        super.view.addSubview(tb)

        fetch_data()
    }



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

    } 
    }
0
Arsen