2014-09-10 1 views
38

В настоящее время я использую предварительный выпуск Xcode 6 (а не бета-версию) и симулятор OS X 10.10 Yosemite beta 7. Я пытаюсь создать проект, разработанный в xcode 6, но приложение падает каждый раз, когда я открываю определенный контроллер представления. Этот контроллер представления буквально не имеет в нем никакого кода (это пустой, статический контроллер табличного представления, в котором есть несколько ячеек и меток по умолчанию).scaledValueForValue: вызов шрифта, который не имеет текстового стиля

Ошибка приведены в:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'scaledValueForValue: called on a font that doesn't have a text style set' 

И прямо перед тем, как я дал эту неудачу утверждение:

*** Assertion failure in -[UICTFont _scaledValueForValue:],   
/SourceCache/UIFoundation_Sim/UIFoundation-371/UIFoundation/iOS/UIFont.m:496 

Я серьезно не имею ни малейшего представления, что происходит, я попытался установить точки останова в ВК но ошибка возникает после вызова метода viewDidLoad (и, следовательно, после выполнения всего моего кода).

Любые идеи? Шрифты для всего в моем проекте - «Baskerville», и я попытался изменить это, но это не повлияло на крушение.

О, и она отлично работает, если я использую Xcode 5.

Update 9/24: Так что я до сих пор не в состоянии понять это. Я попытался использовать метод fontWithDescriptor, но он по-прежнему сбой. Самое забавное: у меня есть много страниц, которые используют пользовательские шрифты, и большинство из них отлично работают, но есть два VC, которые сразу же срабатывают, когда я иду к ним ... у одного из них даже нет пользовательских шрифтов. Я очень ценю все ваши отзывы, но есть ли у кого-нибудь другие идеи/исправления? Я использую официальный выпуск Xcode, и он все еще не работает.

+0

У меня такая же проблема, и я даже не устанавливать шрифты в моем приложении. Только 1 шт. Вы нашли способ исправить это? – Dabrut

ответ

23

Эта проблема исправлена ​​в iOS 8.1.

Вместо того, чтобы тратить время на создание пользовательского представления верхнего/нижнего колонтитула, я просто не применяю пользовательский шрифт к устройствам под управлением iOS 8.0. В любом случае, большинство людей, вероятно, обновится до iOS 8.1.

Я использую следующий код для этого:

NSOperatingSystemVersion iOS_8_1 = (NSOperatingSystemVersion){8, 1, 0}; 

if (![[NSProcessInfo processInfo] respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)] 
    || [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:iOS_8_1]) { 
    header.textLabel.font = [UIFont fontWithName:@"Avenir-Medium" size:header.textLabel.font.pointSize]; 
} 

Первое утверждение верно, если устройство работает под управлением ОС IOS версии ниже, чем 8 (так как isOperatingSystemAtLeastVersion: была введена в прошивкой 8.0). Второй оператор верен, если устройство работает под управлением iOS 8.1 или новее. В обоих случаях мы исключаем только устройства iOS 8.0.

+0

Какое облегчение! Я рад, что мне больше не нужно беспокоиться об этой надоедливой ошибке. :) –

3

Взгляните: http://openradar.io/17623734

К сожалению, на этой ранней стадии Xcode 6 я могу только предложить обходной путь для аварии.

Заменить строку:

[header.textLabel setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:17]]; 

для этого:

header.textLabel.font = [UIFont fontWithDescriptor:[UIFontDescriptor fontDescriptorWithFontAttributes:@{@"NSCTFontUIUsageAttribute" : UIFontTextStyleBody, 
                             @"NSFontNameAttribute" : @"HelveticaNeue-Italic"}] size:17.0]; 
+4

У меня такая же проблема и я попытался использовать вызов fontWithDescriptor. Проблема с крахом решена, но шрифт не установлен на мое указанное имя шрифта. Любой другой трюк, который я пропустил? –

+1

Я столкнулся с тем же. Следуйте рекомендациям, он исправил сбой, но шрифт не установлен в указанном. – meiwin

+0

Извините, ребята, но я сам не смог установить собственный шрифт. Я мог только установить курсив: – carlodurso

1

Наконец нашел обходной путь. Это просто, нужно просто построить шрифт в другом направлении :)

// 1. Grab your custom font 
CGFloat size = 17.0f; 
UIFont *font = [UIFont fontWithName:@"Brandon Grotesque" size:size]; 

// 2. Get descriptor for your font and create new descriptor with 
UIFontDescriptorTextStyleAttribute and UIFontDescriptorSizeAttribute attributes from it. 

UIFontDescriptor *des = [[font fontDescriptor] fontDescriptorByAddingAttributes:@{ 
    UIFontDescriptorTextStyleAttribute: UIFontTextStyleBody, // You can tune this style based on usage 
    UIFontDescriptorSizeAttribute: @(size) 
}]; 

// 3. Get your font 
UIFont *finalFont = [UIFont fontWithDescriptor:des size:0.0] 
+1

Не работает для меня, останавливает сбой, но не использует пользовательский шрифт – iamluke

+0

Работал для меня! Спасибо +1 –

+1

К сожалению, это останавливает авария, но не меняет шрифт, а только размер шрифта. – Josh

0

Это происходит только для меня, когда с использованием либо UITableView или UITableViewController где initWithStyle: вызов метода установлен в . Изменение стиля на UITableViewStylePlain разрешило проблемы.

+0

Хотелось бы узнать, кто проголосовал за это и почему. Это решение сработало для того, что было явно ошибкой. –

3

Как и все здесь, применение исправления в других ответах вызвало игнорирование настройки шрифта. То, что я закончил, - это иметь собственный UITableViewHeaderFooterView (откуда он кажется причиной сбоя) подклассы, у которых была метка, которую я добавил. Затем я использовал этот ярлык вместо свойства textLabel, унаследованного от UITableViewHeaderFooterView, настроил ограничения автоматического макета, установил шрифт, и все было правильно еще раз (хотя не то, что я бы считал идеальным). Я еще раз добавлю, что это похоже на iOS 8.

+0

Как вы относились к тому, чтобы поддерживать различные разные интервалы, которые, как представляется, применяются к ним, в зависимости от того, является ли нижний колонтитул нижним в представлении таблицы или когда заголовок поступает непосредственно после раздела с нижним колонтитулом? Возможно, это только проблемы с нижними колонтитулами, вы используете нижние колонтитулы? – simon

+0

Удивительный! Решил проблему для моих заголовков. – Josh

+0

Можете ли вы показать код, который вы использовали для подкласса 'UITableViewHeaderFooterView', и добавить к нему ярлык? –

4

Хорошо, я наконец понял.

Это происходит, когда сгруппированные представления таблиц имеют заголовки разделов и, возможно, нижние колонтитулы.В качестве временного решения я просто удаляю верхние и нижние колонтитулы из сгруппированных табличных представлений, но если вам действительно нужен шрифт, вы можете создать собственное представление заголовка, переопределив «viewForHeaderInSection» и установив шрифт на ярлыке своего пользовательского представления.

Тем не менее, это определенно ошибка в iOS 8, и, надеюсь, она скоро будет исправлена.

+0

В моем случае он разбился, когда я применил пользовательский шрифт к UITableViewHeaderFooterView.detailLabel. Когда я использую стандартный шрифт с пользовательским размером, он работает хорошо. – Dzmitry

0

Такая же проблема: установите пользовательский шрифт для UITableViewHeaderFooterView в моем приложении init, получите этот сбой при отображении сгруппированного UITableView.

Что работает для меня - это отложить настройку до тех пор, пока не будет создан контроллер вида, т. Е. Делать то, что вы сделали бы в app init в init. Раздражает, но работает для меня.

- (id) init 
{ 
    ... 

    if (self = [super init]) 
    { 
    // customise table view headers 
    UILabel *headerLabel = 
     [UILabel appearanceWhenContainedIn: [UITableViewHeaderFooterView class], nil]; 

    headerLabel.font = 
     [UIFont fontWithName: @"AvenirNext-Medium" size: 15]; 

    ... 
    } 
} 
1

Эта проблема все еще присутствует в iOS 8.0.2, но, похоже, исправлена ​​в 8.1.

мой обходной путь, чтобы установить специальный шрифт, только если IOS больше 8.0.2:

#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending) 

... 

if (SYSTEM_VERSION_GREATER_THAN(@"8.0.2")) { 
    [[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:14.0]]; 
} 
Смежные вопросы