【问题标题】:Why I can't call a method stored in parent UIViewController from embedded UITableViewController?为什么我不能从嵌入式 UITableViewController 调用存储在父 UIViewController 中的方法?
【发布时间】:2016-03-17 11:00:39
【问题描述】:

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

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

它还有一个嵌入了UITableViewController 的容器。表格本身具有拉动刷新功能,当用户拉动表格时它会打印字符串:

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

现在我想从refresh 方法调用printsomeData

这是我尝试的:

父 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。我做错了什么?

【问题讨论】:

    标签: ios swift uitableview uiviewcontroller


    【解决方案1】:

    您将代表分配到哪里?

    并将可选的方法调用写成一行

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

    【讨论】:

    • 谢谢,所以我将if let _ = delegate{ delegate?.printSomeData() } 更改为delegate?.printSomeData(),但您能告诉我如何(以及在​​哪里)分配代表吗?
    • 谢谢,但现在tableViewController.delegate = self 给我带来了错误提示:use of unresolved identifier tableViewController... 我该如何解决这个问题?
    • tableViewController 重命名为您的 tableView 引用。您可以发送更详细的代码版本吗?
    • 我的问题是我这里没有任何 tableView 参考。我刚刚添加了var tableViewController:MainMenuTableViewController,但后来我收到了class MainMenu has no initializers 的错误,我不确定我错过了什么......
    • 我发布了我的代码的最新版本,请检查我原来的问题的编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多