繁体   English   中英

如何在情节提要中将视图控制器连接到其委托?

[英]How can I connect a view controller to its delegate in a storyboard?

我试图弄清楚如何在使用情节提要的项目中获得对另一个视图控制器(委托)的引用。 到目前为止,我的所有尝试都没有使代表成功。

我现在有一个非常简单的项目,只有三个视图控制器。

  • MainScreenViewController:根视图控制器,并包含连接到其他视图控制器(以模态显示)的按钮。

  • PhotoScanViewController:让用户拾取/拍摄照片,然后对其进行扫描以生成一些数据。 然后,用户可以保存照片和相关数据。

  • PhotoListTableViewController:包含照片列表以及用户已保存的数据。

由此,当用户保存照片时,我需要PhotoScan将数据发送到PhotoList。 我认为我应该使用委托模式来执行此操作,其中PhotoList是从PhotoScan接收消息的委托。 当我使用情节提要时,我似乎无法弄清楚如何从PhotoScan获得对PhotoList的引用。 故事板层次 我尝试过的

1)通过查看类似的问题,我看到大多数时候人们在调用prepareForSegue:sender:时设置代表。 但是,在我的情况下,这不起作用,因为PhotoScan和PhotoList没有通过视图层次结构中的segue连接。

2)我尝试使该代表成为IBOutlet以便连接到情节提要中,但是似乎我无法将插座从一个场景连接到另一个场景。

3)由于无法将其连接到情节提要中,因此我尝试以编程方式将其连接到AppDelegate中。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    // Get the storyboard instance
    let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())

    // Get references to controllers
    let photoScanViewController = storyboard.instantiateViewControllerWithIdentifier("PhotoScanViewController") as PhotoScanViewController
    let photoListTableViewController = storyboard.instantiateViewControllerWithIdentifier("PhotoListTableViewController") as PhotoListTableViewController

    // Set delegate
    photoScanViewController.photoDelegate = photoListTableViewController

    return true
}

这也不起作用:当我运行应用程序时, photoListDelegate仍然为零。 我认为发生了什么事, instantiateViewControllerWithIdentifier:给我提供了视图控制器的新实例,而不是应用程序运行时实际使用的实例。

此时,除了更改视图层次结构之外,我不知道还能做什么,以便可以使用prepareForSegue:sender:并将委托设置为其他所有人。

您的委派决定是正确的模式-仅适用于错误的视图控制器。

当用户从PhotoScanViewController保存照片时,请将所有数据数据委托给MainScreenViewController。 现在您已经有了数据,当用户点击“列表”按钮时,将新获取的数据提供给PhotoListViewController。 这应该为您解决。

这是一些代码可以帮助您:

class ImageScannerViewController {
    var delegate:ImageScannerViewControllerDelegate?
    var imageData:NSData? //
    func getScannedImageData() -> NSData {

    //Method to get imageData here

    }
    @IBAction didTapSaveButton(sender:AnyObject?) {
      imageData = self.getScannedImageData()
      self.delegate?.imageScannerViewController(self,imageData:imageData!))

    }
}

protocol ImageScannerViewControllerDelegate {
    func imageScannerViewController(imageScanerViewController, didSaveImageWithImageData, imageData:NSData)
}

在您的MainScreenViewController中

class MainScreenViewController:UIViewController,ImageScannerViewControllerDelegate {
    var imageData:NSData?
    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
       if (segue.identifier == "scannerViewControllerSegue") {
        // pass data to next view
           let scannerViewController = segue.destinationViewController as ImageScannerViewController
           scannerViewController.delegate = self
       }
   }
    func imageScannerViewController(imageScanerViewController, didSaveImageWithImageData, imageData:NSData) {
      self.imageData? = imageData
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM