2016-04-19 3 views
1

Ich habe einen UIPageViewcontroller mit drei ViewControllern. Ein Viewcontroller ist mein ProfileViewcontroller. Ich habe eine Schaltfläche in meinem ProfileViewController, die dem UIPageViewCongtroller mitteilen sollte, wenn er gedrückt wird, um zum nächsten Viewcontroller zu wechseln. Es ist mein erstes Mal, einen Delegierten zu implementieren, aber ich kann einfach nicht herausfinden, warum es nicht funktioniert.Swift Delegate Funktion wird nicht ausgeführt

UIPageViewController Klasse:

class PageViewController: UIPageViewController, ProfileViewControllerDelegate { 

private(set) lazy var orderedViewControllers: [UIViewController] = { 


// The view controllers will be shown in this order 
return [self.newColoredViewController("Search"), 
     self.newColoredViewController("Menu"), 
     self.newColoredViewController("Profile"), 
     self.newColoredViewController("Offer")] 
}() 

override func viewDidLoad() { 
super.viewDidLoad() 

dataSource = self 



if orderedViewControllers.count >= 2 { 
scrollToViewController(orderedViewControllers[1]) 
} 

} 

// MARK: ProfileViewControllerDelegate 
func profileViewControllerDidTouchOffer(viewController:ProfileViewController, sender: AnyObject) { 
scrollToNextViewController() 
print("I'm pressing the offer Button") 
} 

ProfileViewController Klasse:

protocol ProfileViewControllerDelegate : class { 
func profileViewControllerDidTouchOffer(controller: ProfileViewController, sender: AnyObject) 
} 

class ProfileViewController: UIViewController { 

weak var delegate: ProfileViewControllerDelegate? 

@IBOutlet var profileImageView: SpringImageView! 
@IBOutlet var offerButton: UIButton! 

override func viewDidLoad() { 
super.viewDidLoad() 
// Do any additional setup after loading the view, typically from a nib. 
} 
@IBAction func offerButtonTouchUpInside(sender: AnyObject) { 

delegate?.profileViewControllerDidTouchOffer(self, sender: sender) 

} 

Antwort

ich die PageViewController Klasse aktualisiert, indem geändert ich die Viewcontrollers in orderderedViewControllers hinzufügen:

private(set) lazy var orderedViewControllers: [UIViewController] = { 
// The view controllers will be shown in this order 

let profileVC = UIStoryboard(name: "Main", bundle: nil) .instantiateViewControllerWithIdentifier("ProfileViewController") as! ProfileViewController 
profileVC.delegate = self 

return [self.newColoredViewController("Search"), 
     self.newColoredViewController("Menu"), 
     profileVC, 
     self.newColoredViewController("Offer")] 
}() 
+2

Es sieht gut aus, die offensichtliche Sache, die ich aussehen würde für ist, wenn man die Eingeweihten ProfilViewController-Klasse, haben Sie seinen Delegaten festgelegt. Sie haben das gesamte Framework an Ort und Stelle gesetzt, es könnte so einfach sein, wie Sie es vermissen, dem ProfileViewController mitzuteilen, dass sein Delegat der PageViewController ist. –

+0

@TimBull Wie kann ich dem ProfileViewController mitteilen, dass es sich bei delegate um den PageViewController handelt? '?' –

+0

Statt verwenden, können Sie einige Logikfehler mit einem Muster wie '\t \t fangen, wenn wir del = Delegat { \t \t \t del.profileViewControllerDidTouchOffer (self, Absender: Absender) \t \t} else { \t \t \t print ("Ungültiger Delegierter") \t \t} ' –

Antwort

0

Sieht aus wie Sie das Interface so verwenden Ich bin mir nicht sicher, wie es dort getan hat (wahrscheinlich in prepareForSegue), aber ein typisches Muster ist so etwas wie dieses:

let vc = ProfileViewController() 
vc.delegate = self // Or whatever you want to act as the delegate 
// Now show the view controller. 

Der Schlüssel ist, dass vor Mithilfe des View-Controllers stellen Sie sicher, dass die delegate-Eigenschaft auf das Objekt festgelegt ist, das der Delegat ist, und mit dem Protokoll übereinstimmt. Normalerweise wäre der aufrufende Controller der Delegierte.

EDIT: Wenn Sie die UIPageViewController verwenden, dann sollten Sie die Delegierten die Viewcontroller hinzufügen, bevor es zu setViewControllers https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPageViewControllerClassReferenceClassRef/#//apple_ref/occ/instm/UIPageViewController/setViewControllers:direction:animated:completion vorbei:

+0

Das Problem ist, dass ich einen UIPageViewController verwende, also gibt es keinen Übergang auf die nächste Seite mit einem Segue. –

+1

@Mike - Allerdings ist sein grundlegender Punkt immer noch gültig. Wo auch immer Sie Ihren 'ProfileViewController' initialisieren, müssen Sie seinen Delegaten auf das korrekte Objekt einstellen. –

+0

Mike - Ich habe einen Kommentar in die Antwort eingefügt - setze einfach den Delegaten, bevor du den viewController an den UIPageViewController übergibst –

Verwandte Themen