我正在尝试弄清楚如何在使用故事板的项目中获取对另一个视图控制器(委托)的引用。到目前为止,代表在我的所有尝试中都是零。
我现在有一个项目很简单,只有三个视图控制器。
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:
并像其他人一样设置代理。
答案 0 :(得分:0)
您的委派决定是正确的模式 - 只对错误的视图控制器。
当用户从PhotoScanViewController保存照片时,请将所有数据数据委托给MainScreenViewController。现在您拥有了数据,当用户点击"列表时#34;按钮,将新获取的数据提供给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
}
}