繁体   English   中英

Swift / iOS控制器传递给函数时不保留委托

[英]Swift/iOS Controller Does not Retain Delegate when Passed to a Function

我有一个UITableViewController子类,名为LogbookFormTVC ,它符合UIPopoverPresentationControllerDelegate 在此类中,我有一个创建并显示弹出窗口的函数:

// --------------------
// LogbookFormTVC.swift
// --------------------
class LogbookFormTVC: UITableViewController, UIAdaptivePresentationControllerDelegate, UIPopoverPresentationControllerDelegate {

  @IBAction func tapShowPopover(sender: AnyObject) {
    //Tap to show the popover
    self.presentViewController(showAircraftPicker(), animated: true, completion: nil)
  } 

  //Build the popover
  func showAircraftPicker() -> UIViewController{
    //Set up modal
    let storyboard = UIStoryboard(name: "Popovers", bundle: nil)
    var aircraftModal = storyboard.instantiateViewControllerWithIdentifier("AircraftModal") as! AircraftPickerVC
    let pc = aircraftModal.popoverPresentationController
    pc?.sourceView = self.view    
    pc?.delegate = self

    return aircraftModal
  }
}

我想移动此showAircraftPicker()函数并使它在我的应用程序中的任何位置可用,因此我将其移动到另一个文件中,如下所示:

// --------------------
// SomeWhereElse.swift
// --------------------

//This works
func showAircraftPicker(controller: LogbookFormTVC) -> UIViewController{
  //Set up modal
  let storyboard = UIStoryboard(name: "Popovers", bundle: nil)
  var aircraftModal = storyboard.instantiateViewControllerWithIdentifier("AircraftModal") as! AircraftPickerVC
  let pc = aircraftModal.popoverPresentationController
  pc?.sourceView = self.view    
  pc?.delegate = self

  return aircraftModal
}

请注意,我如何将controller的类型设置为LogbookFormTVC以便随其附带的协议一致性。 但是我希望此函数可以与任何类一起使用 (当然,它符合正确的协议)。

因此,这样做不起作用:

func showAircraftPicker(controller: AnyObject) -> UIViewController{
  //Set up modal
  let storyboard = UIStoryboard(name: "Popovers", bundle: nil)
  var aircraftModal = storyboard.instantiateViewControllerWithIdentifier("AircraftModal") as! AircraftPickerVC
  let pc = aircraftModal.popoverPresentationController
  pc?.sourceView = self.view    
  pc?.delegate = self <-- !!! Type AnyObject does not conform to protocol UIPopoverPresentationControllerDelegate !!!

  return aircraftModal
}

如何使此函数与任何类一起使用并传递该类的协议一致性?

您可以尝试像这样为UIViewController创建和扩展:

extension UIViewController {

    func showAircraftPicker(delegate: UIPopoverPresentationControllerDelegate) {

        let storyboard = UIStoryboard(name: "Popovers", bundle: nil)
        var aircraftModal = storyboard.instantiateViewControllerWithIdentifier("AircraftModal") as! AircraftPickerVC
        let pc = aircraftModal.popoverPresentationController
        pc?.sourceView = self.view
        pc?.delegate = delegate

        return aircraftModal
    }
}

请注意,我如何将控制器的类型设置为LogbookFormTVC以便随其附带的协议一致性。 但是我希望此函数可以与任何类一起使用(当然,它符合正确的协议)。

大。 因此,传递“符合正确的协议”类型的对象:

func showAircraftPicker(controller: UIPopoverPresentationControllerDelegate) -> UIViewController{

这正是允许您执行的协议。

如果您想同时符合多个限制,则可以使用泛型:

func showAircraftPicker<T: UIViewController
    where T:UIPopoverPresentationControllerDelegate>(controller: T) -> UIViewController {

暂无
暂无

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

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