为什么我无法从嵌入式UITableViewController调用存储在父UIViewController中的方法?

时间:2016-03-17 11:00:40

标签: ios swift uitableview uiviewcontroller

我有一个父ui视图控制器,它有一个负责将数据打印到控制台的方法:

func printSomeData() {
    print("printing some data")
}

它还有一个嵌入了UITableViewController的容器。表本身具有实现的pull to refresh功能,并在用户拉出表时打印字符串:

func refresh(refreshControl: UIRefreshControl) {
    print("Refreshing!!")
    refreshControl.endRefreshing()
}

现在我想从printsomeData方法拨打refresh

这是我尝试的:

父UIViewController:

class MainMenu: UIViewController, printing{

    func printSomeData() {
        print("some date")
    }

}

嵌入式UITableViewController:

protocol printing{
    func printSomeData()
}

class MainMenuTableViewController: UITableViewController {

    var delegate: printing?

    func refresh(refreshControl: UIRefreshControl) {
        print("Refreshing!!")

    if let _ = delegate{
        delegate?.printSomeData()
    }


    refreshControl.endRefreshing()
}

但现在当我拉桌子时我只看到Refreshing!!,我无法看到printing some data。我做错了什么?

1 个答案:

答案 0 :(得分:2)

您在哪里分配代表?

将可选方法调用写为单行

delegate?.printSomeData()

或者那样:

if self.delegate != nil {
    self.delegate!.printSomeData()
}

内部MainMenu

override func viewDidLoad() {
    super.viewDidLoad()

    // tableViewController is placeholder for `MainMenuTableViewController` reference
    tableViewController.delegate = self
}

如果我理解正确并且MainMenu有一个带有MainMenuTableViewController的ContainerView,那么这可以解决你的问题:

class MainMenu: UIViewController, Printer {

    func printSomeData() {
        print("some date")
    }
}

protocol Printer {

    func printSomeData()
}

class MainMenuTableViewController: UITableViewController {

    var printer: Printer? {

        guard let printer = self.parentViewController as? Printer else {

            return nil
        }
        return printer
    }

    func refresh(refreshControl: UIRefreshControl) {
        print("Refreshing!!")

        printer?.printSomeData()

        refreshControl.endRefreshing()
    }
}