[英]UILabel not updating in Swift3 when passed variable from other Controller via delegate
[英]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.