我目前正在使用Xcode 6预发行版(非测试版)和OS X 10.10 Yosemite beta 7上的模拟器。我正在尝试构建一个在xcode 6中开发的项目,但每当我打开某个视图控制器时应用程序崩溃。这个视图控制器字面上没有代码(它是一个空的,静态的表视图控制器,有几个默认的单元格和标签)。
给出的错误是:
*** 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
我真的不知道发生了什么,我尝试在VC中设置断点,但是在调用viewDidLoad方法之后发生了错误(因此在执行了所有代码之后)。
任何想法?我项目中所有内容的字体都是'Baskerville',我尝试过改变它,但它不会影响崩溃。
哦,如果我使用Xcode 5,它可以正常工作。
更新9/24 :所以我仍然无法解决这个问题。我尝试使用fontWithDescriptor方法,但它仍然崩溃。有趣的是,我有很多页面使用自定义字体,大多数工作正常,但有两个VC,当我去他们时立即崩溃...其中一个甚至没有任何自定义字体。我非常感谢您的所有反馈,但有没有人有任何其他想法/修复?我正在使用Xcode的正式版本,它仍然无效。
答案 0 :(得分: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(因为iOS 8.0中引入了isOperatingSystemAtLeastVersion:
),则第一条语句为真。如果设备运行iOS 8.1或更高版本,则第二个语句为真。因此,对于这两个语句,我们只排除运行iOS 8.0的设备。
答案 1 :(得分:4)
好的,我终于明白了。
当分组表视图具有节标题和可能的页脚时,会发生这种情况。作为临时解决方法,我只是从分组的tableviews中删除页眉/页脚,但如果你真的需要字体,可以通过覆盖“viewForHeaderInSection”创建自定义页眉视图,并在自定义视图的标签上设置字体。
尽管如此,这绝对是iOS 8中的一个错误,希望很快就会修复。
答案 2 :(得分: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];
答案 3 :(得分:3)
与此处的所有人一样,在其他答案中应用此修复程序会导致忽略字体设置。我最终做的是拥有自己的UITableViewHeaderFooterView(看起来崩溃的原因来自)具有我自己添加的标签的子类。然后我使用这个标签而不是从UITableViewHeaderFooterView继承的textLabel属性,设置自动布局约束,设置字体,一切都是正确的(虽然不是我认为理想的)。我再次补充一点,这似乎是iOS 8独有的。
答案 4 :(得分: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]
答案 5 :(得分: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]];
}
答案 6 :(得分:0)
当使用UITableView或UITableViewController时initWithStyle:
方法调用设置为UITableViewStyleGrouped
时,这种情况才会发生。将样式更改为UITableViewStylePlain
可解决问题。
答案 7 :(得分:0)
同样的问题:在我的app init中为UITableViewHeaderFooterView设置自定义字体,在显示分组的UITableView时出现此问题。
对我来说有用的是延迟自定义直到创建视图控制器,即在视图控制器的init中执行你在app 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];
...
}
}