Вызовите метод UIView из ViewController

0 Nithin Reddy Gaddam [2016-07-31 13:37:00]

Я создал два отдельных файла xib для линейного графика и гистограммы и связал его с представлением в моей сцене. Я назначил нить в зависимости от типа данных. У меня есть функция setChart() в моем классе UIView, которую мне нужно вызвать из моего ViewController для рисования диаграмм.

Как я могу вызвать функцию setChart() из моего ViewController? Мой код не работает

UIView:

class BarChartDashboard: UIView {

@IBOutlet weak var barChartView: BarChartView!

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

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

    .....
}


}

ViewController:

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


2 ответа


1 Решение Mohammed Shakeer [2016-07-31 16:06:00]

Создать новую переменную chart в вашей ViewController и добавить эту таблицу в subView на view outlet, подключенного от XIb

Класс 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)
                }
            })
        }
    }
}

1 Mohamad Sheikh [2016-07-31 16:02:00]

В вашем DetailDashboardViewController вы сделали экземпляр своего представления как тип UIView то время как ваш пользовательский класс UIView называется BarChartDashboard, поэтому, чтобы иметь возможность вызывать метод setChart() вы должны установить класс вашего представления в инспекторе класса BarChartDashboard как так как в DetailDashboardViewController экземпляра DetailDashboardViewController необходимо изменить следующим образом:

@IBOutlet weak var chartView: BarChartDashboard!

Итак, теперь переменная экземпляра - это тип BarChartDashboard и теперь метод setChart() можно вызвать из вашего DetailDashboardViewController.

В вашем 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])
}