UILabel导致应用程序崩溃时添加到视图(仅Xcode 6和iOS 8) [英] UILabel causes app to crash when added to view (Xcode 6 and iOS 8 only)

查看:253
本文介绍了UILabel导致应用程序崩溃时添加到视图(仅Xcode 6和iOS 8)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经将我的项目转换到Xcode 6为了构建为iOS 8.然而,一个特定的UILabel导致应用程序崩溃时,它被添加到视图层次结构。这是我收到的唯一错误日志:

   -  [MyViewController _contentInsetsFromFonts]:无法识别的选择器发送到实例0x16d90da0 

我在项目中找不到 contentInsetsFromFonts 。此外,我甚至不能在任何地方找到它的参考,包括苹果的文档。我不为这个UIViewController使用NIB,所以UI是在 loadView 方法中构建的:

   - (void)loadView {
UIImage * trackImage = [UIImage imageNamed:@sliderTrack.png];
sliderBackground = [[UIImageView alloc] initWithImage:trackImage];
UIView * view = [[UIView alloc] initWithFrame:sliderBackground.frame];
[view addSubview:sliderBackground];

slider = [[UISlider alloc] initWithFrame:sliderBackground.frame];
CGRect sliderFrame = slider.frame;
sliderFrame.size.width - = 46;
slider.frame = sliderFrame;
slider.center = sliderBackground.center;
slider.backgroundColor = [UIColor clearColor];
[slider setMinimumTrackImage:[UIImage imageNamed:@sliderMaxMinTrackImage.png] forState:UIControlStateNormal];
[slider setMaximumTrackImage:[UIImage imageNamed:@sliderMaxMinTrackImage.png] forState:UIControlStateNormal];
UIImage * thumbImage = [UIImage imageNamed:@cancel-slider.png];
[slider setThumbImage:thumbImage forState:UIControlStateNormal];
slider.minimumValue = 0.0;
slider.maximumValue = 1.0;
slider.continuous = YES;
slider.value = 0.0;

//设置滑块动作方法
[slider addTarget:self
action:@selector(sliderUp :)
forControlEvents:UIControlEventTouchUpInside];
[slider addTarget:self
action:@selector(sliderDown :)
forControlEvents:UIControlEventTouchDown];
[slider addTarget:self
action:@selector(sliderChanged :)
forControlEvents:UIControlEventValueChanged];

NSString * labelText = @label text;
UIFont * labelFont;
NSString * osVersion = [[UIDevice currentDevice] systemVersion];
if([osVersion floatValue]> = 7.0){
labelFont = [UIFont systemFontOfSize:22.0];

} else {
labelFont = [UIFont systemFontOfSize:24.0];
}

CGSize labelSize = [labelText sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:labelFont,NSFontAttributeName,nil]];

label = [[UILabel alloc] initWithFrame:CGRectMake(0.0,0.0,labelSize.width,labelSize.height)];

CGFloat labelHorizo​​ntalCenter = slider.center.x +(thumbImage.size.width / 2);
label.center = CGPointMake(labelHorizo​​ntalCenter,slider.center.y);

//设置其他标签属性并将其添加到视图
label.textColor = [UIColor whiteColor];
label.textAlignment = NSTextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
label.font = labelFont;
label.text = labelText;

[view addSubview:label];

[view addSubview:slider];

label.layer.delegate = self;

self.view = view;
}

应用程序不会崩溃 [view addSubview: label] ; loadView 方法返回时会崩溃。

解决方案

=https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instp/UIView/layer> UIView 文档:


不要更改此图层对象的委托。


删除此行:

  label.layer。 delegate = self; 

无论你想在这里完成什么,你都需要以另一种方式。 p>

I have transitioned my project to Xcode 6 in order to build for iOS 8. However, a particular UILabel is causing the app to crash when it is added to the view hierarchy. This is the only error log I receive:

-[MyViewController _contentInsetsFromFonts]: unrecognized selector sent to instance     0x16d90da0

I have been unable to locate the contentInsetsFromFonts method anywhere in my project. Additionally, I have not even been able to find a reference for it anywhere online, including Apple's documentation. I am not using a NIB for this UIViewController so the UI is built in the loadView method:

- (void)loadView {
    UIImage *trackImage = [UIImage imageNamed:@"sliderTrack.png"];
    sliderBackground = [[UIImageView alloc] initWithImage:trackImage];
    UIView *view = [[UIView alloc] initWithFrame:sliderBackground.frame];
    [view addSubview:sliderBackground];

    slider = [[UISlider alloc] initWithFrame:sliderBackground.frame];
    CGRect sliderFrame = slider.frame;
    sliderFrame.size.width -= 46; 
    slider.frame = sliderFrame;
    slider.center = sliderBackground.center;
    slider.backgroundColor = [UIColor clearColor];
    [slider setMinimumTrackImage:[UIImage imageNamed:@"sliderMaxMinTrackImage.png"] forState:UIControlStateNormal];
    [slider setMaximumTrackImage:[UIImage imageNamed:@"sliderMaxMinTrackImage.png"] forState:UIControlStateNormal];
    UIImage *thumbImage = [UIImage imageNamed:@"cancel-slider.png"];
    [slider setThumbImage:thumbImage forState:UIControlStateNormal];
    slider.minimumValue = 0.0;
    slider.maximumValue = 1.0;
    slider.continuous = YES;
    slider.value = 0.0;

    // Set the slider action methods
    [slider addTarget:self 
           action:@selector(sliderUp:) 
     forControlEvents:UIControlEventTouchUpInside];
    [slider addTarget:self 
           action:@selector(sliderDown:) 
     forControlEvents:UIControlEventTouchDown];
    [slider addTarget:self 
           action:@selector(sliderChanged:) 
     forControlEvents:UIControlEventValueChanged];    

    NSString *labelText = @"label text";
    UIFont *labelFont;
    NSString *osVersion = [[UIDevice currentDevice] systemVersion];
    if ([osVersion floatValue] >= 7.0) {
        labelFont = [UIFont systemFontOfSize:22.0];

    } else {
        labelFont = [UIFont systemFontOfSize:24.0];
    }

    CGSize labelSize = [labelText sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:labelFont, NSFontAttributeName, nil]];

    label = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, labelSize.width, labelSize.height)];

    CGFloat labelHorizontalCenter = slider.center.x + (thumbImage.size.width / 2);
    label.center = CGPointMake(labelHorizontalCenter, slider.center.y);

    // Set other label attributes and add it to the view
    label.textColor = [UIColor whiteColor];
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    label.font = labelFont;
    label.text = labelText;

    [view addSubview:label];

    [view addSubview:slider];

    label.layer.delegate = self;

    self.view = view;
}

The app does not crash at [view addSubview:label]; it crashes after the loadView method returns.

解决方案

From the UIView documentation:

Never change the delegate of this layer object.

Delete this line:

label.layer.delegate = self;

Whatever you're trying to accomplish here, you'll need to do in another way.

这篇关于UILabel导致应用程序崩溃时添加到视图(仅Xcode 6和iOS 8)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆