2016-02-13 3 views
1

Я использую библиотеку, которая управляет прокруткой между контроллерами представлений.swift - код вызова с другого контроллера представления

Кажется, что единственный способ, которым я могу использовать кнопку в одном из контроллеров моего представления для перехода к другому, - это вызов определенного метода из контроллера вида, который управляет функцией прокрутки.

Есть ли способ вызова метода в другом виде контроллера?

Спасибо

+0

какая библиотека? –

+0

EZSwipeController. Похоже, что у них есть функциональность по умолчанию для кнопок контроллера навигации, но я просто хочу использовать обычную кнопку. – Walking

+0

Не могли бы вы рассказать о том, чего именно вы пытаетесь достичь? «Код звонка с другого контроллера представления» кажется мне немного двусмысленным ... Более конкретным было бы хорошо –

ответ

0

Существует множество способов связи между контроллерами представлений. Один из наиболее распространенных шаблонов для этого в iOS - delegate pattern. Один контроллер просмотра содержит ссылку на другую, а делегат соответствует protocol. Протокол представляет собой набор методов, которые первый контроллер может вызывать, когда происходят определенные события. Я попытался бы настроить протокол и один из ваших контроллеров представлений был бы делегатом для другого

+0

Спасибо за ваш ответ. Можете ли вы указать мне ресурс? Все это звучало немного знакомо, но реализация кажется пугающей. Спасибо – Walking

+0

Я добавил две ссылки для шаблона делегата и протокола. См. Раздел «Делегация» на этом сайте: http://www.raywenderlich.com/46988/ios-design-patterns –

0

Если вы посмотрите на код, размещенный на GitHub, вы можете видеть, что диспетчер страниц отображается из класса EZSwipeController , Поэтому, учитывая, что вы подклассом EZSwipeController (или поддерживаете ссылку где-нибудь), теперь вы можете получить доступ к свойству pageViewController и прокручивать страницу.

Если подкласс:

class MyVC : EZSwipeController{ 
    func buttonTapped(){ /* use self.pageViewController to "page" */ } 
} 

Жутко, я лично никогда не работал с UIPageViewController, и, насколько я могу сказать, что нет легко способа для прокрутки страницы в легкой форме.

Я лично не пробовал (обычно я проверяю свои ответы перед публикацией), но вы можете его отключить. Если у вас нет ссылки на контроллер просмотра, вам нужно его получить (дайте мне знать, если это основная проблема).

Существует вопрос о том, так что, кажется, пользуются определенной популярностью в отношении UIPageViewController пейджинга:

UIPageViewController, how do I correctly jump to a specific page without messing up the order specified by the data source?

И от Apple docs:

enter image description here

Я хотел бы также поощрять вы посмотрите на код внутри из EZSwipeController репо, где вы можете найти не подвергавшиеся воздействию метод, который делает прокрутку:

@objc private func clickedLeftButton() { 
     let currentIndex = stackPageVC.indexOf(currentStackVC)! 
     datasource?.clickedLeftButtonFromPageIndex?(currentIndex) 

     let shouldDisableSwipe = datasource?.disableSwipingForLeftButtonAtPageIndex?(currentIndex) ?? false 
     if shouldDisableSwipe { 
      return 
     } 

     if currentStackVC == stackPageVC.first { 
      return 
     } 
     currentStackVC = stackPageVC[currentIndex - 1] 
     pageViewController.setViewControllers([currentStackVC], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: nil) 
    } 

линия «ключ» это один:

pageViewController.setViewControllers([currentStackVC], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: nil) 

Я думаю EZSwipeController также предоставляет контроллеры просмотра содержащийся в pageViewController, который является свойством, называемым stackVC, который представляет собой массив контроллеров представления, содержащийся в контроллере просмотра страницы.

Я предполагаю, что с этими знаниями вы должны иметь возможность листать страницу, несмотря на кажущееся немного «хаки» (ИМХО, разработчики должны были разоблачить логику подкачки с самого начала).

Мой совет для вас после того, как все это просто:

Попробуйте свернуть его самостоятельно. Это не огромная задача, и вы полностью контролируете доступность и то, как вы хотите работать с ней. Класс EZSwipeController довольно мал, поэтому вам не нужно писать много кода для собственного решения. Вы также можете пойти вперед и разблокировать репо и изменить/использовать его по своему усмотрению.

Я надеюсь, что это поможет. Если у вас возникнут какие-либо дополнительные вопросы или если что-то неясно, я буду готов помочь вам.