ios - Swift/iOS Controller 在传递给函数时不保留委托(delegate)

标签 ios uitableview swift

我有一个名为 LogbookFormTVCUITableViewController 子类,它符合 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 以使其协议(protocol)符合性。但我希望此函数适用于任何类(当然,它符合正确的协议(protocol))。

所以这样做是行不通的:

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
}

我怎样才能使这个函数与任何类一起工作并传递该类的协议(protocol)一致性?

最佳答案

您可以尝试像这样为 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
    }
}

关于ios - Swift/iOS Controller 在传递给函数时不保留委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089780/

相关文章:

ios - 我们应该将所有数据存储在最新版本的 firebase 上吗?

ios - 如何在 iOS 中将照片保存到 google drive 的文件夹中

iOS 8 UITableViewController 分隔符滚动渲染

ios - 通过此 segue 将单元格标题从 UITableView 传送到新 ViewController 缺少的命令是什么?

ios - UITableView.reloadRows 在 Timer.scheduledTimer 内部调用时重置行动画类型

ios - Swift JSON 解析为字典

ios - 如何在 iOS 中通过触摸来回移动对象

ios - Alamofire 请求最初返回值,但在通过完成处理程序时接收为 nil

ios - 从过滤后的数组中在 tableView 中显示数据

swift - UITableViewController : Scrolling to bottom with dynamic row height starts animation at wrong position