从另一个视图控制器访问常量

Posted

技术标签:

【中文标题】从另一个视图控制器访问常量【英文标题】:Accessing a constant from another view controller 【发布时间】:2016-12-14 03:28:33 【问题描述】:

我在 firstViewController 类中有这个函数,它产生 itemID

 func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) 

     // Check if the metadataObjects array is not nil and it contains at least one object.
    if metadataObjects == nil || metadataObjects.count == 0 
        qrCodeFrameView?.frame = CGRect.zero
        messageLabel.text = "No QR/barcode is detected"
        return
    
   //Get metadata object
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
    if supportedCodeTypes.contains(metadataObj.type) 
    //if the found metadata is equal to the QR code metadata then update the status label's text and set the the bounds
        let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
        qrCodeFrameView?.frame = barCodeObject!.bounds

        if metadataObj.stringValue != nil 
        messageLabel.text = metadataObj.stringValue
            let itemID = metadataObj.stringValue
            print(itemID)


        
    

我想在另一个名为 secondViewController 的 viewController 中调用 itemID。如何从 secondViewController 中的 firstViewController 调用 itemID?

【问题讨论】:

【参考方案1】:

您只需将其传递给“prepareForSegue”。 只需确保在 secondviewcontroller 上将 itemId 声明为变量。

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
        if (segue.identifier == "secondViewControllerSeque") 
            let secondViewController = segue.destination as! SecondViewController
            secondViewController.itemID  = self.itemID 
        

    

【讨论】:

【参考方案2】:

如果你从 FirstViewController 到 SecondViewController 你可以像这样传递数据。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "SecondViewControllerSegue" 
        let secondViewController = segue.destination as? SecondViewController
        if let itemID = itemID 
            secondViewController.itemID = itemID
        
    

但不要忘记在 FirstViewController 中创建 itemID 变量,而是像这样编写代码

var itemID: String?


if metadataObj.stringValue != nil 
    messageLabel.text = metadataObj.stringValue
        itemID = metadataObj.stringValue
    

【讨论】:

【参考方案3】:

firstViewController 类需要一个成员变量 itemID。然后第二个 viewcontroller 应该可以引用它。

现在 itemID 是您的 captureOutpur 函数中的一个局部变量。 一旦函数完成运行,这就会消失。而是将其分配给成员。

【讨论】:

【参考方案4】:

如果你使用的是segue,你只需要这样做:

FirstViewController(注意:名称使用大写字母):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "ShowNextView"         // the identifier is what you named it
        if let vc = segue.destination as? SecondViewController 
            vc.itemID = itemID                     // itemID is accessible here, probably global
        
    

SecondViewController:

var itemID:String

func viewWillAppear() 
    // code to use itemID value

【讨论】:

【参考方案5】:

只需执行 3 个步骤,假设您要从 ViewControllerA to ViewControllerB: 传递数据

1.在ViewControllerA and ViewControllerB之间创建一个segue

2.在属性检查器中使用标识符命名segue

3.覆盖prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) at ViewControllerA

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "MySegueID" 
        if let destination = segue.destinationViewController as? ViewControllerB 
            destination.myInformation = self.myInformation
        
    

【讨论】:

【参考方案6】:

首先在 FirstViewController 中声明一个变量。

var itemID: String?

并在导航到 SecondViewController 之前调用您的函数将值分配给该变量。

if metadataObj.stringValue != nil 
    self.itemID = metadataObj.stringValue
   

现在,还要在 SecondViewController 中声明 itemIdForSVC 公共变量,

public var itemIdForSVC: String?

如果您使用 Storyboard,则在导航时传递这样的参数,

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
        if (segue.identifier == "secondViewControllerSeque") 
            let secondViewController = segue.destination as! SecondViewController
            secondViewController.itemIdForSVC  = self.itemID 
        

    

或者,如果您以编程方式完成所有操作,则在导航时像这样传递,

let secondViewConttoller = SecondViewController()
secondViewController.itemIdForSVC  = self.itemID
self.navigationController?.pushViewController(secondViewConttoller, animated: true)

【讨论】:

谢谢,我正在以编程方式完成所有工作。我应该在 FirstViewController 的哪个位置声明我似乎对此有问题的代码 let secondViewConttoller = SecondViewController() secondViewController.itemIdForSVC = self.itemID self.navigationController?.pushViewController(secondViewConttoller, animated: true) 您应该将此代码添加到您想要转到下一页的事件中,即 onButtonTapped 事件。

以上是关于从另一个视图控制器访问常量的主要内容,如果未能解决你的问题,请参考以下文章

从另一个视图控制器访问变量。迅速

快速从另一个访问 Viewcontroller 的实例

View helper 可以在一个控制器中访问,但不能从另一个控制器访问

如何在没有任何推送序列的情况下快速从另一个视图控制器访问方法?

如何从另一个类访问 UIView 的宽度和高度?

从另一个类访问 viewController 元素