Калибровка UILabel для установки?

Примечание: попытка получить свойство ошибки, отличной от объекта

Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.

Типичный пример для non-object notice будет

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

В этом случае $users представляет собой массив (а не объект), и он не имеет никаких свойств.

Это похоже для доступа к несуществующему индексу или ключу массива (см. Примечание: Undefined Index ).

Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует неконтролируемое возвращаемое значение, например. когда библиотека возвращает NULL, если объект не существует или просто неожиданное значение, отличное от объекта (например, в результате Xpath, структуры JSON с непредвиденным форматом, XML с неожиданным форматом и т. д.), но код не проверяет такой условие.

Поскольку эти не-объекты часто обрабатываются дальше, часто возникает фатальная ошибка при вызове метода объекта для не-объекта (см.: Неустранимая ошибка: вызов члену function ... на не-объекте ), останавливая скрипт.

Его можно легко предотвратить, проверив условия ошибки и / или переменную, соответствующую ожиданию. Здесь такое уведомление с примером DOMXPath:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Проблема заключается в доступе к свойству nodeValue первого поля, пока он не был проверен, существует ли он или нет в $result коллекция. Вместо этого он платит, чтобы сделать код более явным, назначив переменные объектам, на которых работает код:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Связанные ошибки:

43
задан Community 23 May 2017 в 12:08
поделиться

6 ответов

Мне нужно было сделать это достаточно, чтобы я расширил UILabel, чтобы сделать это за меня:

@interface UILabel (BPExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth;
@end

@implementation UILabel (BPExtensions)


- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth
{
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0);
    self.lineBreakMode = NSLineBreakByWordWrapping;
    self.numberOfLines = 0;
    [self sizeToFit];
}
@end

затем, чтобы иметь метку, имеющую переменную многострочную высоту, но фиксированную ширину:

[myLabel sizeToFitFixedWidth: kSomeFixedWidth];

98
ответ дан 26 November 2019 в 22:28
поделиться

Необходимо использовать NSString's -sizeWithFont:forWidth:lineBreakMode: метод для получения связанных метрик калибровки для маркировки.

17
ответ дан Lily Ballard 26 November 2019 в 22:28
поделиться

Кроме того, изменитесь numberOfLines свойство к 0, если Вы собираетесь использовать тот код.

10
ответ дан Sophie Alpert 26 November 2019 в 22:28
поделиться

Кроме того, необходимо будет реализовать метод UITableViewDelegate:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

И имеют его, возвращают общую ширину ячеек, скорректированную для измененного текстового поля.

Еще одно примечание - Размер для Установки должен на самом деле работать, если Вам установили количество строк к 0, как ранее упомянуто. Это дало бы Вам, поддерживают размер высотой, увеличенной до accomidate обернутый в слово текстовый набор в маркировке и набор ширины к тому, что имела исходная ширина маркировки.

, Который не поможет Вам, хотя, поскольку необходимо получить размер в heightForRow перед, ячейка получена, таким образом, Вы - более обеспеченное вычисление необходимой высоты (и очень вероятно, кэширование того вычисления, чтобы не замедлить рендеринг таблицы)

2
ответ дан Kendall Helmstetter Gelner 26 November 2019 в 22:28
поделиться

NSString's -sizeWithFont:forWidth:lineBreakMode: does not actually perform the word wrap. Instead, use -sizeWithFont:constrainedToSize:lineBreakMode: to get an accurate width AND height value for the string.

5
ответ дан pix0r 26 November 2019 в 22:28
поделиться

Попробуйте это:

sv.text =  @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; 
sv.textAlignment = UITextAlignmentCenter; 
sv.lineBreakMode = UILineBreakModeWordWrap; 
sv.numberOfLines = 0;
[sv sizeToFit]; 
4
ответ дан 26 November 2019 в 22:28
поделиться
Другие вопросы по тегам:

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