1

Я пытаюсь добавить ограничения на мои коллекции. Но когда я использую этот код в своем классе я получаю сообщение об ошибке консолиПрограммно добавить ограничения на collectionViewCell?

class IndexD: UICollectionViewCell { 

func contstraints() { 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": IndexD.self])) 
} 
} 

Ошибка I получает

непризнанного селектор послал к классу

Я не уверен, как изменить код, чтобы удалить какие-либо ошибки. Цель состоит в том, чтобы установить ограничение для каждой конкретной коллекции.

ответ

1

В вашем словаре views, вы передаете неправильное представление для просмотра v0. Вы должны использовать self, который ссылается на текущий экземпляр класса вместо IndexD.self, который относится к самому классу.

Измените ваш views на:

views: ["v0": self] 

Есть и другие вопросы, а также. Вы добавляете сгенерированные ограничения в self, но их необходимо добавить к более высокому элементу в иерархии представлений. "H:|[v0]|" будет генерировать ограничения, которые связаны с superviewself, поэтому вам действительно нужно сделать superview?.addConstraints(....

С iOS 8 существует более простой способ активировать ограничения. Вы можете установить их свойство isActive на true, и они будут автоматически добавлены в соответствующие виды. Если у вас есть несколько ограничений для активации, вы можете вызвать NSLayoutContraint.activate() с массивом ограничений, и iOS активирует все ограничения.

Если у вас нет NSLayoutFormatOptions, просто пройдите []. И, поскольку это значение по умолчанию для этого параметра, вы можете оставить options: [] в целом.

Так принимая все это во внимание, вот исправленная версия кода:

func contstraints() { 
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", metrics: nil, views: ["v0": self])) 
} 
+0

Спасибо за помощь! Когда я запускаю новый код, я получаю ошибку ** «Невозможно разобрать формат ограничения: Невозможно интерпретировать '|' символ, потому что связанный вид не имеет супервизора H: | [v0] | **. При удалении '|' из кода, который он запускает, но не создает ограничений – baxu

+0

Что вы пытаетесь выполнить в частности? Поскольку это коллекцияViewCell, вы обычно не добавляете ограничения для самих ячеек для управления их компоновкой. Вы можете добавить в них ограничения, чтобы управлять расположением элементов внутри ячейки. – vacawama

+0

Да, вы правы. Из дальнейших исследований я считаю, что динамическая автореализация ячеек - это то, что мне нужно использовать, а не ограничения. – baxu

0

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

import UIKit 

class IndexD: UICollectionViewCell { 

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

    addContstraints() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 


func addContstraints() { 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": IndexD.self])) 
} 

Я изменил свое имя методы, потому что при попытке выполнить его в переназначении инициализации, Swift относится ваш метод, как [NsLayoutConstraints] и путаю.

 Смежные вопросы

  • Нет связанных вопросов^_^