将数据传递到实例化的视图控制器,而无须安全

时间:2019-01-05 21:55:54

标签: ios swift mapbox

我试图将一个简单的值传递给实例化的视图控制器。我不确定这样做的正确方法。

我已经研究了协议和委托,我已经在我的应用程序中的一些地方使用过,并且仍然感到困惑,但是随后遇到了一个看起来更简单的解决方案,我无法理解去工作。

此解决方案是在实例化时更新实例化视图控制器中的变量。

我正在使用Mapbox,并在点击注释时,希望将存储在数据库中的唯一值传递给有关该注释的详细信息视图。我已将下面的示例简化为我认为对解决问题至关重要的所有内容。

在我的第一个视图控制器中,地图视图:

// function that fires on annotation tap
func mapView(_ mapView: MGLMapView, didSelect annotation: MGLAnnotation) {

        let placeID = "123456" // simplified for the purpose of this question

        func createPlaceDetailSheet() {

            let placeDetailSheet = PlaceDetailViewController()

            self.addChildViewController(placeDetailSheet)
            self.view.addSubview(placeDetailSheet.view)
            placeDetailSheet.didMove(toParentViewController: self)

            let height = view.frame.height
            let width  = view.frame.width
            placeDetailSheet.view.frame = CGRect(x: 0, y: self.view.frame.maxY, width: width, height: height)

            placeDetailSheet.uniqueID = "123456" // trying to set value here
    }

        createPlaceDetailSheet()
    }

在第二个视图控制器中,我具有以下内容:

class PlaceDetailViewController: UIViewController {

    var uniqueID: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        print(uniqueID)
    }
}

我希望从第二个视图控制器中打印出唯一的ID(“ 123456”),但仅打印空字符串初始化程序。

我已经阅读了数小时的有关堆栈溢出的文章,试图解决这个问题,这是我的全部智慧。大多数答案依赖于performSegue的用法,而我没有使用。我也不确定上述方法或使用协议和委托是否正确。

谢谢。

1 个答案:

答案 0 :(得分:0)

当您访问变量以添加子视图时,将加载视图,因此,在设置控制器的viewDidLoad值之前,将执行uniqueID方法中的打印语句。

在设置控制器类后立即设置uniqueID

let placeDetailSheet = PlaceDetailViewController()

placeDetailSheet.uniqueID = "123456"

或者,创建一个以唯一ID作为参数的自定义控制器初始化程序。

class PlaceDetailViewController: UIViewController {

    // MARK: Properties

    var uniqueID: String = ""

    // MARK: Initializers

    init(uniqueID: String) {
        self.uniqueID = uniqueID
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    // MARK: View Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        print(uniqueID)
    }
}

let placeDetailSheet = PlaceDetailViewController(uniqueID: "foo")