Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Довольный объятие ведет более вероятно для сжатия маркировок. То, что Вы хотите, является высотой маркировок, которые будут более уважать. Таким образом, Вы использовали бы приоритет сопротивления сжатия. Однако Вам на самом деле не нужен ни один из тех.
, Так как Вы устанавливаете свои ограничения программно, необходимо будет установить translatesAutoresizingMaskIntoConstraints
на false
для маркировок также:
leftRow.translatesAutoresizingMaskIntoConstraints = false
rightRow.translatesAutoresizingMaskIntoConstraints = false
нижнее ограничение является на самом деле хорошим началом, но Вы не хотите соответствовать высоте меньшей маркировки излишне к высоте большей маркировки. Таким образом, Вы хотели бы добавить ограничение, которое "меньше чем или равно нижней привязке":
make.bottom.lessThanOrEqualTo(self.snp.bottom)
, Если Вы хотите использовать ленивые переменные, необходимо будет изменить путь, там инициализируемый. Путем Вы записали, что это инициализирует их сразу же при инициализации класса. Но Вы только хотите, чтобы они были инициализированы, когда там использовал первый раз. Для этого необходимо записать это как это:
private lazy var leftRow: UILabel = {
return UILabel()
}()
private lazy var rightRow: UILabel = {
return UILabel()
}()
Однако в Вашем случае Вам не нужна ленивая загрузка, таким образом, можно инициализировать их непосредственно:
private let leftRow = UILabel()
private let rightRow = UILabel()
, Так как Вы используете ограничения макета, Вы не должны звонить sizeToFit
на маркировках. Это ничего не делает.
Вызов layoutIfNeeded()
в init ничего не делает, так как это назовут так или иначе, как только Вы добавите ComponentCell
как подпредставление к любому другому представлению.