2015-05-07 32 views
0

我有一个名为LogbookFormTVCUITableViewController子类,它符合UIPopoverPresentationControllerDelegate。在这一类我有一个创建和显示酥料饼的功能:Swift/iOS控制器在通过函数时不保留委托

// -------------------- 
// 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 
} 

我怎样才能使该功能的工作与任何类,并通过对类的协议一致性?

+0

什么类是你的'showAircraftPicker:在'方法?如果您要将委托分配给'self',则需要确保'self'符合'UIPopoverPresentationControllerDelegate'。 – AdamPro13

+0

它不在课堂上。这是一个独立的帮手功能。 –

+0

如果你想引用'self',你将需要在类扩展中编写函数。你可能会希望它是一个'UIViewController'扩展。或者你是否试图将代理设置为传入的“控制器”? – AdamPro13

回答

3

你可以尝试这样的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 
    } 
} 
+0

这很好,谢谢! –

0

注意我怎么也设置控制器LogbookFormTVC的类型,以便其协议符合它进来了。但是我希望这个函数可以与任何类一起工作(当然,它符合正确的协议)。

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

func showAircraftPicker(controller: UIPopoverPresentationControllerDelegate) -> UIViewController{ 

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

如果要同时符合多重限制,通用更是得心应手:

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

嗯......这很有趣,但是'pc?.sourceView = self.view'行不起作用,因为'UIPopoverPresentationControllerDelegate'不是'UIViewController'的子类,因此没有'view财产。 –

+0

更新了如何符合多个事物在同一时间。 –