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")]
}()
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. –
@TimBull Wie kann ich dem ProfileViewController mitteilen, dass es sich bei delegate um den PageViewController handelt? '?' –
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} ' –