Преобразование проекта Swift в простой в использовании фреймворк для Cocoapods - PullRequest
0 голосов
/ 14 мая 2018

Так что мне нужна небольшая помощь, так как я не могу понять это и потратил много времени на это уже без каких-либо результатов. Большинство вещей, которые я нахожу в Интернете, касается того, как преобразовать быстрый проект в фреймворк, но моя проблема не в самом проекте или в Cocoapods, а в о том, как и что я должен сделать доступным для разработчиков,

Итак, я построил фреймворк Swift, который вы можете найти здесь , он построен на UICollectionView с пользовательской flowlayout и функцией бокового считывания.

Проблема в том, что я не знаю, как я могу сделать это простым в использовании для разработчиков, я бы хотел, чтобы он вел себя как UICollectionView, где вам нужно реализовать Пользовательский делегат и источник данных без необходимости использовать значения по умолчанию UICollectionViewDelegate и UICollectionViewDatasource, поэтому я могу отфильтровать вещи, которые могут вызвать непредвиденное поведение, или просто упростить задачу.

Так что было бы хорошим подходом здесь? Я подумываю о создании подкласса UICollectionView, чтобы людям не приходилось использовать UICollectionView (потому что это может сбить с толку), а вместо этого VerticalCardSwiperView, который имеет такое же поведение, но немного более ограниченный. Я просто не знаю, правильный ли это подход.

Любые советы, идеи или хорошие примеры будут высоко оценены!


edit 1: Я обновил проект, чтобы он уже имел структуру фреймворка, мне просто нужно выяснить, как я собираюсь предоставить доступ к пользовательским частям разработчикам.

edit 2: Я получил один ответ, но я думаю, что вопрос легко понять неправильно. Цель состоит в том, чтобы заставить его действовать и вести себя как UICollectionView (с делегатами, источником данных, ...), но более ограниченным, и мне интересно, как мне это сделать, если это вообще возможно.

edit 3: Хорошо, у меня большая часть работает, я оставлю здесь ссылку на Github онлайн, чтобы люди, которым нужно что-то подобное, могли проверить это сами. По сути, я сделал пользовательские настройки VerticalCardSwiperDelegate и VerticalCardSwiperDatasource, например:

/// This datasource is used for providing data to the `VerticalCardSwiper`.
public protocol VerticalCardSwiperDatasource: class {

    /**
     Sets the number of cards for the `UICollectionView` inside the VerticalCardSwiperController.
     - parameter verticalCardSwiperView: The `VerticalCardSwiperView` where we set the amount of cards.
     - returns: an `Int` with the amount of cards we want to show.
     */
    func numberOfCards(verticalCardSwiperView: VerticalCardSwiperView) -> Int

    /**
     Asks your data source object for the cell that corresponds to the specified item in the `VerticalCardSwiper`.
     Your implementation of this method is responsible for creating, configuring, and returning the appropriate `CardCell` for the given item.
     - parameter verticalCardSwiperView: The `VerticalCardSwiperView` that will display the `CardCell`.
     - parameter index: The that the `CardCell` should be shown at.
     - returns: A CardCell object. The default value is an empty CardCell object.
    */
    func cardForItemAt(verticalCardSwiperView: VerticalCardSwiperView, cardForItemAt index: Int) -> CardCell
}

и затем я подключил их в классе VerticalCardSwiper:

public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    return datasource?.numberOfCards(verticalCardSwiperView: verticalCardSwiperView) ?? 0
}

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    return (datasource?.cardForItemAt(verticalCardSwiperView: verticalCardSwiperView, cardForItemAt: indexPath.row))!
}

И, наконец, я просто подклассифицировал UICollectionView в VerticalCardSwiperView и передал его как параметр (так как это в основном подкласс UICollectionView, он делает то же самое, просто имеет другое имя, которое это легче понять разработчикам) для функций делегата / источника данных. Надеюсь, это поможет кому-то еще. Кроме того, если у вас есть лучший подход, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 17 мая 2018

Это выглядит великолепно!

Я бы сказал, что если вы хотите выставить UICollectionView, тогда следуйте UITableView, и это подход с UIScrollView делегатами с подклассами.

protocol VerticalCardSwiperDelegate: UICollectionViewDelegate {
  // ...

Можно также создать подклассы UICollectionViewDelegate и UICollectionViewDataSource в VerticalCardSwiperDelegate и VerticalCardSwiperDataSource делегатах, соответственно, для того же эффекта.(Если вы считаете, что это имеет смысл сделать.)

protocol VerticalCardSwiperDelegate: UICollectionViewDelegate {
  // ...

Тем не менее, ваш компонент довольно специфичен и, возможно, предоставление базового UICollectionView может вызвать проблемы.Здесь я бы заблокировал все детали реализации и полностью установил VerticalCardSwiper.Это дает вам гибкость для полного изменения базовой архитектуры.

Например, в ваших делегатах вы должны передать обратно VerticalCardSwiper, а не базовый компонент.

func cardForItemAt(verticalCardSwiper: VerticalCardSwiper, cardForItemAt index: Int) -> CardCell {
  // ...

Как правило,Вы хотите, чтобы выставленный интерфейс был как можно меньше.Это сделано для того, чтобы помочь разработчикам (меньше учиться) и меньше для вас, чтобы поддерживать и задавать вопросы.

Некоторые комментарии по общедоступным интерфейсам были бы полезны.Я счастлив, когда могу нажать Alt-click, чтобы получить подсказки. Вы уже сделали это.

...