Как вызвать функцию из другого контроллера в swift - PullRequest
1 голос
/ 18 октября 2019

Я установил кнопку Show Charts на контроллере DetailView, которая запускает функцию getChartData и показывает мне значения в отображаемом виде в диаграммах, теперь я хочу вызвать эту функцию в didselectrow на главном Viewcontroller, чтобы диаграмма загружалась автоматически, но это не удается. Когда я попытался вызвать эту функцию в didselectrow (DVC.getChartsData), я получил ошибку «Поток 1: Неустранимая ошибка: неожиданно обнаружил ноль при неявном развертывании необязательного значения» *

DVC.getChartsData

Поток 1. Неустранимая ошибка: неожиданно обнаружен ноль при неявном развертывании необязательного значения

ViewController:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {        
        let Storyboard = UIStoryboard(name: "Main", bundle: nil)
        let DVC = Storyboard.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
        DVC.getDetailName = coin[indexPath.row].name
        let formatedRoundingPrice = (coin[indexPath.row].price as NSString).floatValue * currencymodel.indexValue
        let formatedPrice = String (format: "%.3f", formatedRoundingPrice)
        DVC.getDetailPrice = formatedPrice
        self.navigationController?.pushViewController(DVC, animated: true)
        let percentage = String ((coin[indexPath.row].percent as NSString).floatValue)
        DVC.getDetailPercent = percentage
        tableView.deselectRow(at: indexPath, animated: true)
        //DVC.getChartData()
}

DetailViewController:

    @IBAction func tapLineChart(_ sender: Any) {


       getChartData()


    }

    func getChartData () {

        let chart = HITLineChartView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: displayView.bounds.height))
        displayView.addSubview(chart)
        let max = String((priceResult.max() ?? 0.0).rounded(.up))
        let min = String((priceResult.min() ?? 0.0).rounded(.down))
        let maxChange = abs((listOfChanges.max()) ?? 0.0).rounded(.up)
        let minChange = abs((listOfChanges.min()) ?? 0.0).rounded(.up)
        absMaxPercentage = Int(maxChange > minChange ? maxChange : minChange)
        titles = ["\(getDetailName) closing price is \(getDetailPrice)"]

        print(data)
        chart.draw(absMaxPercentage,
                   values: listOfChanges,
                   label: (max: max, center: "", min: min),
                   dates: namesArray,
                   titles: titles)

        addCloseEvent(chart)

        finalURL = baseURL + "bitcoin" + "/market_chart?vs_currency=usd&days=5"
        print(finalURL)
        getBitcoinData(url: finalURL)

    }

Как загрузить мои диаграммы, нажмите наопределенную ячейку таблицы вместо нажатия на tapLineChart.

https://imgur.com/fg2502P

https://imgur.com/C4AzaRY

https://imgur.com/jOrwujy

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Вы захотите использовать делегатов или наблюдателей для передачи данных между контроллерами представления.

Я новичок в учебниках, но я немного об этом написал здесь: https://www.eankrenzin.com/swift-blog/pass-data-throughout-your-app-with-observers-and-notifications-xcode-11-amp-swift-5

Вы должны использовать необязательную привязку, чтобы развернуть ваш VC let DVC = Storyboard.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController

Вашкод падает из-за этой строки. Проверьте ваш конструктор интерфейса, чтобы убедиться, что идентификатор правильный. Редактировать: эта строка не вызывала сбоя, но все же лучше использовать необязательную привязку. Строка: https://imgur.com/CVP1x6H

ПРИМЕЧАНИЕ. Это ужасная практика - засорять ваше приложение случаями, когда делегаты и наблюдатели моглиработай. Также нет глобальных. Глобальные катастрофы для отладки и создания технического долга.

1 голос
/ 18 октября 2019

если вы хотите вызвать функцию в viewControllerB, которую вы объявляете из viewController A.

, просто создайте объект файла класса, для которого вы хотите использовать функцию из

var obj mainVC = MainViewController()



class MainViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    func commonMethod() {
        print("From the main class")
    }
}

Использованиеэтот объект, вызовите функцию в другом файле, где вы хотите его использовать

class OtherViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        mainVC.commonMethod()
        // Do any additional setup after loading the view, typically from a nib.
    }
}

Кроме того, вы также можете создать новый файл swift, назовите его Global.swift, создать все ваши функции, которые вы хотите использоватьво всем приложении здесь. Они становятся «глобальными функциями»

...