【问题标题】:How to make UITableView updating with delegate and datasource even if the view controller is a "child" controller?即使视图控制器是“子”控制器,如何使用委托和数据源更新 UITableView?
【发布时间】:2016-08-19 04:45:07
【问题描述】:

我有两个视图控制器,我们称之为 X 和 Y。X 有一个称为“容器”的 UIView。 Y 有一个 UIButton 和 UITableView,委托和数据源设置为 Y。在我初始化 X 内部的 Y 视图后,X 的容器执行container.addSubView (Y.view)。显示了按钮和表格视图,但表格视图根本没有任何内容。当我添加断点时,根本不会调用 numberOfRowsInSectioncellForRowAtIndexPath 函数。但是如果我直接打开 Y 视图控制器,表格视图会正确更新。为什么会这样?以及如何解决?谢谢。

编辑:代码。

class Util: NSObject {
    static func getViewControllerID(vcname: String, fromStoryboard storyboardName: String = "Main") -> UIViewController {
        return UIStoryboard(name: storyboardName, bundle: nil).instantiateViewControllerWithIdentifier(vcname)
    }
}

class X : UIViewController {

    var tabs = [UIView]();
    var tabIdx = 1;
    var views = [UIView]();
    @IBOutlet var container : UIView!;

    override func viewDidLoad() {
        super.viewDidLoad();

        for i in 1...4 {
            let tab = self.view.viewWithTag(i)!;
            tab.backgroundColor = UIColor.clearColor();
            tabs.append(tab);
        }

        views.append(Util.getViewControllerID("Dummy").view);
        views.append(Util.getViewControllerID("Dummy").view);
        views.append(Util.getViewControllerID("Y").view);
        views.append(Util.getViewControllerID("Dummy").view);

        changeActiveTab(0);
    }

    func changeActiveTab (idx : Int) {
        tabIdx = idx;
        for tab in tabs { tab.backgroundColor = UIColor.clearColor(); }
        tabs[idx].backgroundColor = UIColor(hexString: "41C7DB");
        for view in views { view.removeFromSuperview(); }
        let view = views[idx];
        view.frame = container.bounds;
        container.addSubview(view);
    }

    @IBAction func tabTapped (sender: AnyObject) {
        let btn = sender as! UIButton;
        let idx = btn.tag - 11;
        changeActiveTab(idx);
    }
}


class Y : UIViewController, UITableViewDelegate, UITableViewDataSource {

    var dummyData = [String]();

    override func viewDidLoad() {
        super.viewDidLoad()

        for i in 101...106 {
            let btn = self.view.viewWithTag(i)! as! UIButton;
            btn.makeViewRoundedRectWithCornerRadius(4);
        }

        dummyData.append("a");
        dummyData.append("b");
        dummyData.append("c");
        dummyData.append("d");
        dummyData.append("e");
        dummyData.append("f");
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell")!;

        cell.backgroundColor = UIColor.clearColor();
        var lbl = [UILabel]();
        for i in 1...6 { lbl.append(cell.viewWithTag(i)! as! UILabel); }
        for i in 0...5 { lbl[i].text = dummyData[i]; }

        return cell;
    }

}

【问题讨论】:

  • @user3182143 完成。

标签: ios swift uitableview subview


【解决方案1】:

当您将childViewController 添加为subview

container.addSubview(view);

您还需要将您的 childViewController 移至父级。尝试添加这行代码

self.addChildViewController(childViewController)
childViewController.didMoveToParentViewController(self)

并且不要忘记当你从 superView 中删除它时,只需调用

childViewController.removeFromParentViewController()

【讨论】:

  • 对不起,我在这里问了问我的同事后,我意识到我只持有“视图”,而不是视图控制器本身。所以当视图试图更新 tableview 时,viewcontroller 已经消失了。所以现在我已经更改了代码以包含每个视图的父视图控制器,并且它可以正常工作。谢谢!
  • 但是你的代码也给我增加了一些知识,所以谢谢你的回答! :D
  • 不客气!)因此,如果您的问题已回答,请将其标记为已回答。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 2015-06-18
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多