2017-01-14 14 views
1

У меня есть класс, который я хочу получить из пользовательского подкласса UIPageViewController. Для этой цели я определил протокол, как обычно в классе я хочу получить информацию:Второй делегат в классе возможно в Swift?

protocol GetMyIndexDelegate: class { 
    func getIndex() 
} 

class LandingPageViewController: UIViewController, GetMyIndexDelegate { 

func getIndex() { 
    print("IT GOT CALLED") 
}} 

, а затем в классе, который должен отправить информацию:

class pageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

weak var delegate2: GetMyIndexDelegate? 

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
    if (completed && finished) { 
     if let currentVC = pageViewController.viewControllers?.last { 
      let index = vcArr.index(of: currentVC) 
      delegate2?.getIndex() 
     } 
    } 
} 

я должен был использовать delegate2 здесь, потому что уже есть делегат UIPageViewControllerDelegate и если я использую delegate я получаю сообщение об ошибке

«не может overide свойства с типом UIPageViewControllerDelegate»

Однако, когда я запускаю приложение и просматриваю страницы, функция getIndex не вызывается.

Я не уверен, что у вас может быть только 2 делегата в одном классе. Я не вижу другого способа запуска функции getIndex при каждом прокрутке страницы и изменении индекса.

+0

Вы можете создать два различных делегатов и использовать его, вы не можете использовать ни одного делегата в двух разных местах. – iphonic

+0

вот что я сделал. но функция getIndex не вызывается. – DuckMan

+0

Да, проблема в том, что 'delegate2' был' nil'. Не связанный, я бы предложил более значимое имя, чем 'delegate2'. Возможно, 'indexDelegate' или что-то в этом роде. – Rob

ответ

1

Я подозреваю, что delegate2 - это нуль на линии, где вы пытаетесь позвонить getIndex. Поскольку delegate2 является собственностью weak, он не сохранит объект в живых. Если у вас нет какой-либо другой сильной ссылки на объект, тогда он будет освобожден и будет присвоено значение delegate2.

0

Да, у вас может быть столько делегатов, которых вы хотите. Но у вас может быть небольшая путаница в использовании. Есть delegate2nil? Вы назначаете экземпляр некоторого класса, который подтверждает GetMyIndexDelegate? Пожалуйста, убедитесь, что первый

Посмотрите на здесь

Delegate Example