Метод draw () UICollectionViewCell не вызывается после перезагрузки данных

inline хорошо работает с концепцией процедурной абстракции :

inline double square (double x) { return x*x;}

int squareTwice(double x) {
    double first = square(x);
    double second = square(x);
    return first * second; 
}

Вышеупомянутое в корне похоже на следующее:

int squareTwice(double x) {
    double first = x*x;
    double second = x*x;
    return first * second; 
}

Это происходит потому, что когда компилятор inline-расширяет вызов функции, код функции вставляется в поток кода вызывающего; поэтому, может быть, проще подвергнуть процедуре абстрагирование второго примера к первому примеру.

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

0
задан nihasmata 17 January 2019 в 17:40
поделиться

3 ответа

У меня была такая же проблема с моим представлением коллекции, лучшее решение - добавить функциональность в ваш GameCollectionViewCell скажем updateView() и добавить элементы пользовательского интерфейса в подпредставление

func updateView() {
    var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))

            var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
            var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
            var princessRect : CGRect = CGRect(origin: origin, size: size)

            princess.frame = princessRect
            princess.layer.masksToBounds =  true
            princess.layer.cornerRadius = 2;

            addSubview(princess)
}

И внутри viewcontroller при создании ячейки для indexpath вызывает вышеуказанный метод

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! GameCollectionViewCell
    cell.updateView()       
    return cell
}
0
ответ дан Srinivasan Raman 17 January 2019 в 17:40
поделиться

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

При добавлении подпредставлений в подкласс UICollectionViewCell поместите свои коды в метод init:

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

Если вы хотите что-то изменить в слое своего представления, Вы можете переопределить layoutSubviews():

override func layoutSubviews() {
        super.layoutSubviews()

}

Надеюсь, это поможет.

0
ответ дан Glenn 17 January 2019 в 17:40
поделиться

Большое спасибо @RobertDresler. Он спас мой день. После перезагрузки CollectionView, если вы вызываете метод setNeedsDisplay (), вызывается метод draw (). Пожалуйста, проверьте ниже.

override func prepareForReuse() {

        super.prepareForReuse()
        setNeedsDisplay()

    }
0
ответ дан nihasmata 17 January 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: