Программное создание пакета наклеек, проблема с приведением UICollectionViewCell к MSStickerView

Итак, я решил не использовать раскадровки в своем стикерпаке расширения сообщений. Приложение iMessage поставляется с файлом раскадровки и MessagesViewController.swift. Я создал 2 файла с именами CollectionViewController и StickerCell. Идея состоит в том, чтобы создать подкласс CollectionViewCell и преобразовать его в MSStickerView и удалить это представление из очереди в мой CollectionView как «ячейку».

Вот код для настройки «StickerCell» как MSSstickerView:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let item = data[indexPath.row]
    return deQStickerCell(for: item, at: indexPath)
}

private func deQStickerCell(for sticker: MSSticker, at indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView?.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! StickerCell
    cell.stickerView.sticker = sticker
    return cell
}

и код в моем классе StickerCell:

class StickerCell: UICollectionViewCell {
    var stickerView: MSStickerView!
}

Я предполагаю, что проблема здесь, поскольку я успешно сделал это с раскадровкой и точным кодом в StickerClass, за исключением того, что var был IBOutlet. Так что явно что-то не подключается к CollectionView или я пропустил шаг. В Interface Builder я бы создал CollectionViewController, дал ему CollectionView, дал ему CollectionViewCell, затем наложил сверху UIView и изменил его класс на MSStickerView.

Как программно воссоздать рабочий процесс Interface Builder!?


person Jake Dobson    schedule 03.11.2017    source источник


Ответы (1)


Трудно точно понять, в чем ваша проблема, но из того, что я могу сказать, вы не возвращаете StickerCell с подвидом stickerView. Что отличается от IB, так это то, что вы никогда не инициализируете свой stickerView. Вам нужно добавить инициализацию, которая создаст и добавит представление в вашу ячейку. Что-то вроде (псевдокод):

override init(frame: CGRect) {
    super.init(frame: frame)

    self.stickerView = StickerView()
    self.contentView.addSubview(self.stickerView)
    // Set up your constraints & layout
}
person stevethomp    schedule 06.11.2017
comment
Ооооооо совсем. Я воспринимаю как должное то, что IB делает для меня. Вот почему я заставляю себя делать что-то программно. Я попробую что-то вроде этого. - person Jake Dobson; 07.11.2017