簡體   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