2016-04-19 1 views
1

У меня есть UIPageViewcontroller, содержащий три ViewControllers. Один Viewcontroller - это мой ProfileViewcontroller. У меня есть кнопка в моем ProfileViewController, которая должна указывать UIPageViewCongtroller при нажатии, чтобы перейти к следующему Viewcontroller. Это моя первая реализация делегата, но я просто не могу понять, почему он не работает.Функция Swift Delegate не выполняется

класс

UIPageViewController:

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:

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) 

} 

Ответ

Я обновил класс PageViewController, изменяя способ, которым я добавить ViewControllers в orderderedViewControllers:

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

Это выглядит хорошо, очевидно, что я хотел бы посмотреть на то, когда вы инициировать ProfileViewController, вы установили его делегат. т. е. вы поместили всю структуру на место, это может быть так просто, как вам не хватает, если сообщить ProfileViewController, что это делегат является PageViewController. –

+0

@TimBull Как сообщить ProfileViewController, что его делегат является PageViewController? '?' –

+0

Вместо использования, вы можете поймать некоторые логические ошибки с рисунком, как '\t \t, если пусть дель = делегат { \t \t \t del.profileViewControllerDidTouchOffer (самость, отправитель: отправитель) \t \t} еще { \t \t \t print («Недопустимый делегат») \t} ' –

ответ

0

Похоже, что вы используете InterfaceBuilder, так что я не знаю, как это делается там (вероятно, в prepareForSegue), но типичная картина что-то вроде этого:

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

Ключ, что перед используя контроллер вида, вы убедитесь, что для свойства делегирования задано то, что является делегатом, и соответствует протоколу. Обычно вызывающий контроллер будет делегатом.

EDIT: Если вы используете UIPageViewController, то вы должны добавить делегат к ViewController перед передачей его setViewControllers https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPageViewControllerClassReferenceClassRef/#//apple_ref/occ/instm/UIPageViewController/setViewControllers:direction:animated:completion:

+0

Проблема в том, что я использую UIPageViewController, поэтому переход на следующую страницу с помощью Segue не происходит. –

+1

@Mike - Тем не менее, его основной пункт все еще действителен. Везде, где вы инициализируете свой «ProfileViewController», вам необходимо установить его делегат на правильный объект. –

+0

Mike - Я добавил редактирование в ответ - просто установите делегат перед тем, как передать viewController в UIPageViewController –

 Смежные вопросы

  • Нет связанных вопросов^_^