【问题标题】:How to reload tableview using view controller (swift)如何使用视图控制器重新加载 tableview (swift)
【发布时间】:2015-10-28 20:40:42
【问题描述】:

我对此很陌生。我花了几个小时来解决有关此主题的各种问题,但找不到适合我的问题的答案。

我有一个带有 tableview 作为子视图的 viewcontroller(不是 tableviewcontroller)。我的问题是如何在视图控制器的 :viewwillappear 方法中重新加载表数据。在方法内部,我无法“访问”tableview 实例。 (我也知道我不能使用 reloaddata() 因为我没有使用 tableviewcontroller)。

您知道任何简单的解决方案吗? (我非常认为协议可以在这里提供帮助?)

这就是代码:

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

        }
    }

【问题讨论】:

    标签: ios swift uitableview reloaddata


    【解决方案1】:

    你的问题是 tb 是一个局部变量,所以它在 viewDidLoad() 之外是不可见的。

    如果您将 tb 设为视图控制器的属性(也称为实例变量),那么您可以从控制器的任何方法中使用它:

    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 是一个局部变量这一事实并不意味着您的 UITableView 对象会在 viewDidLoad() 完成时消失。这意味着您对UITableView 的引用 消失了。表格视图对象本身存在,因为它已添加到您的视图层次结构中,但您不再有对它的引用,因为您的变量超出了范围。

    要进一步了解变量和它们引用的对象之间的区别,请搜索“范围”和“按引用传递”。

    【讨论】:

    • 感谢您的提示。我深入了解了实例变量
    • 还可以看看@Arsen 的回答,它展示了如何防止 tableView 成为一个可选的立即初始化它。该技术通常不适用于 UI 元素,但在这种情况下确实有效。
    • 感谢 2019 年的 Swift 4! ?
    【解决方案2】:

    您可以在viewWillAppear: 中访问您的tableView IBOutlet,也可以拨打reloadData。我不知道你为什么认为你不能,但它应该可以正常工作。

    【讨论】:

      【解决方案3】:

      您必须创建一个链接到 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()
          } 
      }
      

      【讨论】:

        【解决方案4】:
        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()
        
            } 
            }
        

        【讨论】:

          【解决方案5】:

          快速重新加载tableView

          class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
          
             //This is outlet of tableView...
           @IBOutlet public var userTableView : UITableView!
          
              override func viewDidLoad() {
                  super.viewDidLoad()
                  userTableView.delegate = self
                  userTableView .datasource = self
              }
          
              override func viewWillAppear(animated: Bool) {
                  super.viewWillAppear(animated)
                  fetchData()      
               
              }
          
           func fetchData(){
                 //Here you can fetch your required data
          
                 //Here the tableView will be reload...
                  userTableView.reloadData()
          
           }
          

          【讨论】:

          • 在 fetchdata() 函数中使用 userTableView.reloadData()。您需要为 fetchdata 提供更多上下文/代码,以便任何人正确回答。
          猜你喜欢
          • 2019-09-09
          • 2015-09-21
          • 2015-09-10
          • 2019-03-18
          • 2016-12-16
          • 1970-01-01
          • 2011-02-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多