我对此很陌生.我花了几个小时来讨论关于这个主题的各种问题,但找不到适合我的问题的答案. 我有一个viewcontroller(不是tableviewcontroller)与tableview作为子视图.我的问题是如何在视图控制器
          我有一个viewcontroller(不是tableviewcontroller)与tableview作为子视图.我的问题是如何在视图控制器的: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)")
            }
        }
    }
 你的问题是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对象就会消失.这意味着您对UITableView的引用消失了.表视图对象本身仍然存在,因为它已添加到视图层次结构中,但由于变量超出范围,因此您不再引用它.
要进一步阅读变量与它们引用的对象之间的区别,请搜索“范围”和“按引用传递”.
