Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.
Типичный пример для 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;
Связанные ошибки:
Мне нужно было сделать это достаточно, чтобы я расширил 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];
Необходимо использовать NSString's -sizeWithFont:forWidth:lineBreakMode:
метод для получения связанных метрик калибровки для маркировки.
Кроме того, изменитесь numberOfLines
свойство к 0
, если Вы собираетесь использовать тот код.
Кроме того, необходимо будет реализовать метод UITableViewDelegate:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
И имеют его, возвращают общую ширину ячеек, скорректированную для измененного текстового поля.
Еще одно примечание - Размер для Установки должен на самом деле работать, если Вам установили количество строк к 0, как ранее упомянуто. Это дало бы Вам, поддерживают размер высотой, увеличенной до accomidate обернутый в слово текстовый набор в маркировке и набор ширины к тому, что имела исходная ширина маркировки.
, Который не поможет Вам, хотя, поскольку необходимо получить размер в heightForRow перед, ячейка получена, таким образом, Вы - более обеспеченное вычисление необходимой высоты (и очень вероятно, кэширование того вычисления, чтобы не замедлить рендеринг таблицы)
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.
Попробуйте это:
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];