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

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

我正在尝试弄清楚如何在使用故事板的项目中获取对另一个视图控制器(委托)的引用。到目前为止,在我所有的尝试中,委托都是零。

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

据此,当用户保存照片时,我需要 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。现在您有了数据,当用户点击 "list" 按钮时,将新获取的数据提供给 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
    }

}