1

У меня есть ViewController «LandingPageViewController», который имеет встроенный PageViewController «pageViewController».Делегат, возвращающий неправильный экземпляр Number of ViewController

Я создал функцию делегата для записи из «pageViewController» в LandingPageViewControlelr ». Это прекрасно работает, и данные отправляются в« LandingPageController », однако я не могу взаимодействовать с каким-либо из его элементов, потому что делегат создает новый экземпляр .

enter image description here

Когда приложение запускает первый он идет в "LandingPageViewController" и если я печатаю (сам) в viewDidLoad и viewDidAppear это результат:

Delegate viewDidLoad...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60> 
Delegate viewDidAppear...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60> 

Затем, когда я прокрутил к 3-ю странице и делегат называется я получаю следующий результат печати (сам)

Delegate function...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf2940e3a0> 

enter image description here

Это код из моего «LandingPageViewController», который получает данные:

protocol GetMyIndexDelegate { 
    func getIndex(index: Int) 
} 

class LandingPageViewController: UIViewController, GetMyIndexDelegate { 
@IBOutlet var createAccountButton: UIButton! 

//delegate functionto get index 
func getIndex(index: Int) { 
    if index == 3 { 
     print("Delegate function...\(self)") 

     //print(createAccountButton) 

    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    print("Delegate viewDidLoad...\(self)") 
} 
} 

и вот код из класса "pageViewController":

class pageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

let myHeight = 667 
let myCenter = 333.5 

// define the delegate for use 
var indexDelegate: 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) 

      if index == 3 { 

       // this is the line causing problem 
       self.indexDelegate = LandingPageViewController() 

       print("PageView Index Defined As...\(self.indexDelegate)") 
       indexDelegate?.getIndex(index: index!) 

       //goToVC() 

      } 
     } 
    } 
} 

я считаю, что это проблема здесь:

self.indexDelegate = LandingPageViewController() 

это определение неправильного экземпляра ?????

В качестве стороннего ключа у меня был другой метод делегирования в другом направлении, с viewController на первую страницу «pageViewController», и проблема заключалась в том, что мне нужно было правильно определить индекс страницы в пределах UIPageViewController со следующим кодом:

self.delegate = self.childViewControllers[0] as! pageViewController 

им не уверен, как это будет работать в вопросе выше как LandingPageViewController является родителем? страницыViewController?

+0

Несвязанный, но как бы стиль программирования, я бы рекомендовал переименовать класс 'pageViewController' в' PageViewController' (или что-то, начинающееся с прописной буквы). Классы и типы всегда должны начинаться с буквы верхнего регистра. Это не требуется, но это вопрос соглашения, который делает ваш код более удобочитаемым ... – Rob

+0

, который беспокоил меня какое-то время, его в списке – DuckMan

ответ

0

self.indexDelegate = LandingPageViewController() неверен, потому что вы создаете новый контроллер представления программным способом, а не ссылаетесь на тот, который уже был создан для раскадровки.

У вас есть встроенный segue, который вы используете, чтобы встроить контроллер просмотра страницы в другую сцену контроллера. Таким образом, вы можете использовать prepareForSegue в родительском контроллере представления, чтобы установить любые свойства, которые вы хотите в контроллере дочернего представления.

Но если вы просто ищете ссылку на контроллер дочернего представления в родительском объекте, это childViewControllers.first или childViewControllers[0]. И если ребенок ищет ссылку на свой родительский контроллер представления, это всего лишь parent (или в вашем случае, parent as? GetMyIndexDelegate).

+0

segue идет от LandingPageViewController к страницеViewController. где делегат идет по-другому, будет ли это продолжаться? – DuckMan

+0

В 'prepareForSegue' в контроллере родительского представления установите дочерний' indexDelegate', чтобы ссылаться на 'self' (то есть на родителя). В качестве альтернативы и, вероятно, проще, на самом деле существует существующее свойство в контроллере дочернего представления, называемое 'parent', и вы можете использовать его. – Rob

+0

Спасибо. Ive никогда не использовал метод prepareForSegue и не понимал этого в этом случае из-за направленной вещи. Мне нужно будет изучить, как родительское свойство будет работать в этом случае. может быть немного более жидким (по крайней мере, для моего мышления) – DuckMan

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