【问题标题】:Call UIView method from ViewController从 ViewController 调用 UIView 方法
【发布时间】:2016-07-31 10:37:37
【问题描述】:

我为折线图和条形图创建了两个单独的 xib 文件,并将其链接到我场景中的视图。我根据数据类型分配了笔尖。我的 UIView 类中有一个函数 setChart(),我需要从 ViewController 调用它来绘制图表。

如何从我的 ViewController 调用函数 setChart()?我的代码不起作用

UIView:

class BarChartDashboard: UIView {

@IBOutlet weak var barChartView: BarChartView!

override func awakeFromNib() {
    .....
}

func setChart(dataPoints: [String], values: [Double]) {

    .....
}


}

视图控制器:

class DetailDashboardViewController: UIViewController {

@IBOutlet weak var chartView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    runQueries(2)

    if index != 3{
        chartView = NSBundle.mainBundle().loadNibNamed("BarChartDashboard", owner: self, options: nil)[0] as? UIView
    }
    else{
        chartView = NSBundle.mainBundle().loadNibNamed("LineChartDashboard", owner: self, options: nil)[0] as? UIView
    }
}
}

private extension DetailDashboardViewController {

func runQueries(period: Int) {

    self.query(false, periodIndex: period){ (success) -> Void in
        if success {
            // do second task if success
            dispatch_async(dispatch_get_main_queue(), {
                if self.index != 3{
                    (self.chartView as! BarChartDashboard).setChart(self.yAxis, values: self.xAxis)
                }
                else{
                    (self.chartView as! LineChartDashboard).setChartData(self.yAxis, yAxisMax: self.xAxisMax, yAxisMin : self.xAxisMin)
                }
            })
        }
    }
}


func query(min: Bool, periodIndex: Int, completion: (success: Bool) -> Void) {
    .......
}

}

【问题讨论】:

    标签: ios swift uiview


    【解决方案1】:

    在您的 ViewController 中创建一个新变量 chart 并将此图表作为 subView 添加到从 xib 连接的 view outlet

    您的 ViewController 类如下所示:

    class DetailDashboardViewController: UIViewController {
    
    @IBOutlet weak var chartView: UIView!
    var chart: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
            if index != 3{
                chart = NSBundle.mainBundle().loadNibNamed("BarChartDashboard", owner: self, options: nil)[0] as? BarChartDashboard
         }
            else{
                chart = NSBundle.mainBundle().loadNibNamed("LineChartDashboard", owner: self, options: nil)[0] as? LineChartDashboard
            }
    
        self.chartView.addSubView(chart)
        self.chart.frame = self.chartView.bounds
        runQueries(2)
        }
    
    private extension DetailDashboardViewController {
    
    func runQueries(period: Int) {
    
        self.query(false, periodIndex: period){ (success) -> Void in
            if success {
                // do second task if success
                dispatch_async(dispatch_get_main_queue(), {
                    if self.index != 3{
                        (self.chart as! BarChartDashboard).setChart(self.yAxis, values: self.xAxis)
                    }
                    else{
                        (self.chart as! LineChartDashboard).setChartData(self.yAxis, yAxisMax: self.xAxisMax, yAxisMin : self.xAxisMin)
                    }
                })
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在您的DetailDashboardViewController 中,您已将视图实例设置为UIView 类型,而您的自定义UIView 类名为BarChartDashboard,因此为了能够调用方法setChart(),您应该设置您在类检查器中的视图类为 BarChartDashboard 以及您的 DetailDashboardViewController 实例变量应更改如下:

      @IBOutlet weak var chartView: BarChartDashboard!
      

      所以现在实例变量的类型是BarChartDashboard,现在可以从您的DetailDashboardViewController 调用方法setChart()

      在你的DetailDashboardViewController

      @IBOutlet weak var chartView: BarChartDashboard!
      override func viewDidLoad() {
           super.viewDidLoad()
      
           runQueries(2)
      
           if index != 3{
              chartView = NSBundle.mainBundle().loadNibNamed("BarChartDashboard", owner: self, options: nil)[0] as? UIView
           }
           else{
              chartView = NSBundle.mainBundle().loadNibNamed("LineChartDashboard", owner: self, options: nil)[0] as? UIView
           }
           chartView.setChart(dataPoints: ["hello","world"], values: [20.0,21.5])
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-19
        • 1970-01-01
        • 2023-03-08
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多