UICollectionView, nib из целевой платформы, зарегистрированной как ячейка, дает сбой во время выполнения

У меня есть UICollectionViewCell, вытянутый в xib и сопровождаемый быстрым файлом класса. Эти два файла являются частью целевой платформы пользовательского интерфейса моего приложения (называемой SomeUI).

В контроллере представления моего представления коллекции (в цели приложения) я регистрирую перо как ячейку представления коллекции. Мой код контроллера представления выглядит следующим образом:

import UIKit
import SomeUI

let reuseIdentifier = "Cell"

class ACollectionViewController: UICollectionViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.collectionView.registerNib(UINib(nibName: "JamesTheCollectionViewCell", bundle: NSBundle(identifier: "SomeUI")), forCellWithReuseIdentifier: reuseIdentifier)
    }

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView!) -> Int {
        return 1
    }

    override func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as JamesTheCollectionViewCell
        cell.titleLabel.text = "yippee"
        return cell
    }
}

В наконечнике представление ячейки имеет свой пользовательский класс, установленный соответствующим образом; JamesTheCollectionViewCell в модуле SomeUI.

скриншот ячейки xib в xcode

Хотя Xcode кажется вполне довольным этой настройкой, во время выполнения я получаю сообщение об ошибке, поскольку класс, определенный в JamesTheCollectionView.swift, не может быть найден.

Неизвестный класс _TtC19collectionViewThing26JamesTheCollectionViewCell в файле построителя интерфейсов.

Если я переключу целевое членство для JamesTheCollectionView.swift с фреймворка на приложение (но оставлю xib как часть фреймворка), все будет работать нормально. Но я попросил файл xib загрузить класс из фреймворка… что я упустил, почему он не работает, когда класс реализации ячейки является частью фреймворка?

Для справки, вот файл реализации ячейки:

import UIKit

public class JamesTheCollectionViewCell: UICollectionViewCell {
    @IBOutlet public weak var titleLabel: UILabel!
}

person alexkent    schedule 05.08.2014    source источник


Ответы (1)


Решено.

TL:ДР; При изменении целевого членства для файлов не забудьте выполнить «Продукт» > «Очистить» перед следующей сборкой!

Объяснение: проблема заключалась в том, что «SomeUI» не является допустимым идентификатором UIBundle, поэтому NSBundle(identifier: "SomeUI") вернул nil, поэтому строка registerNib зарегистрировала nib из пакета приложения, а не из фреймворка. В пакете приложения не было класса реализации ячейки, поэтому произошел сбой.

Но… пакет приложений тоже не должен был содержать перо? Так что же там происходило? Я переключал целевое членство для файла пера и реализации. Я не запускал «Чистку» между сборками, поэтому копия пера осталась в целевой папке сборки приложения.

Решение исходной проблемы состояло в том, чтобы правильно загрузить перо из фреймворка SomeUI, заменив NSBundle(identifier: "SomeUI") на NSBundle(forClass: JamesTheCollectionViewCell.self).

person alexkent    schedule 06.08.2014