Передача данных из ViewController в класс - PullRequest
0 голосов
/ 23 января 2019

Я довольно новичок в Swift и борюсь с этой проблемой. Я хочу передать размер и точку squareImage другому файлу swift в моем проекте, используя setSquareRec.

Просмотр контроллера:

class ViewController: UIViewController, SceneDelegate {

    @IBOutlet var squareImage: UIImageView!

    var scene = Scene()

    func setSquareRec() {
        scene.x = Int(squareImage.bounds.minX)
        scene.y = Int(squareImage.bounds.minY)
        scene.width = Int(squareImage.bounds.width)
        scene.height = Int(squareImage.bounds.height)
    }

    ...

} 

Класс:

protocol SceneDelegate{
    func setSquareRec()
}

class Scene: SKScene {

    var width = 0
    var height = 0
    var x = 0
    var y = 0

    ...

    let ARViewController = ViewController()
    ARViewController.setSquareRec()

}

Это дает мне ошибку Thread 5: Fatal error: Unexpectedly found nil while unwrapping an Optional value в первой строке (scene.width = Int(sqareImage.bounds.minX)) функции setSquareRec

Как это возможно, что это не имеет значения ?! И как это можно передать другому классу? Я посмотрел на очень много решений, но ни одно из них не сработало, или я не понимаю.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

То, как вы используете свой делегат, неверно, потому что вы не используете делегат itselg. Пожалуйста, посмотрите на подход ниже.

import UIKit

class ViewController: UIViewController, SceneDelegate {

    @IBOutlet var squareImage: UIImageView!

    var scene = Scene()

    override func viewDidLoad() {
        super.viewDidLoad()

        //set delegate for scene as this delegate
        scene.sceneDelegate = self
    }

    func setSquareRec() {
        scene.x = Int(squareImage.bounds.minX)
        scene.y = Int(squareImage.bounds.minY)
        scene.width = Int(squareImage.bounds.width)
        scene.height = Int(squareImage.bounds.height)
    }
}

protocol SceneDelegate{
    func setSquareRec()
}

class Scene: SKScene {

    var width = 0
    var height = 0
    var x = 0
    var y = 0
    var sceneDelegate: SceneDelegate?

    ...
    //call this delegate method like this
    //This will call the setSquareRec method to any class who is set as delegate
    sceneDelegate.setSquareRec()
    ...
}

не проверено, пожалуйста, дайте мне знать, если возникнет проблема

0 голосов
/ 23 января 2019

Вы создаете экземпляр контроллера вида с помощью let ARViewController = ViewController().

Попробуйте накачать его из раскадровки.

Не стесняйтесь спрашивать, не ясно ли это.

...