如何将UILabel的属性反映到另一个?

时间:2016-09-28 09:23:26

标签: ios objective-c swift xcode

我正在尝试动态自定义UITableViewController。所以我改变了cell.textLabel的许多属性。现在我想将这些属性复制到detailTextLabel和我通过代码创建的一个标签。怎么做?

    cell.textLabel.backgroundColor = [UIColor colorWithRed:0 green:0.188235 blue:0.313725 alpha:1];
    cell.textLabel.textColor=[UIColor whiteColor];
    cell.textLabel.font=[UIFont fontWithName:@"HelveticaNeue" size:26];
    cell.textLabel.autoresizingMask=UIViewAutoresizingFlexibleRightMargin;

这是我的 cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
        cell.textLabel.text=[_names objectAtIndex:indexPath.row];
        cell.textLabel.tag=indexPath.row;

        cell.detailTextLabel.text=[_phones objectAtIndex:indexPath.row];
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png"] ];
        [imageView setFrame:CGRectMake(380,10,30,50)];
        [cell addSubview:imageView];
        //customize the seperator
        UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1000, 1)];/// change size as you need.
        separatorLineView.backgroundColor = [UIColor grayColor];// you can also put image here
        [cell.contentView addSubview:separatorLineView];
        cell.contentView.backgroundColor = [UIColor colorWithRed:0 green:0.188235 blue:0.313725 alpha:1];
        cell.textLabel.backgroundColor = [UIColor colorWithRed:0 green:0.188235 blue:0.313725 alpha:1];
        cell.textLabel.textColor=[UIColor whiteColor];
        cell.textLabel.font=[UIFont fontWithName:@"HelveticaNeue" size:26];
        cell.textLabel.autoresizingMask=UIViewAutoresizingFlexibleRightMargin;
        //here i want to copy the properties
        return cell;
    }

8 个答案:

答案 0 :(得分:4)

对于Swift3

class MyLabel: UILabel {
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        backgroundColor = UIColor(red: 0, green: 0.188235, blue: 0.313725, alpha: 1)
        textColor = UIColor.white
        font = UIFont(name: "HelveticaNeue", size: 26)
        autoresizingMask = .flexibleRightMargin
    }
}

以这种方式创建UILabel的子类。

#import "MyLabel.h"

@implementation MyLabel

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    self.backgroundColor = [UIColor colorWithRed:0 green:0.188235 blue:0.313725 alpha:1];
    self.textColor=[UIColor whiteColor];
    self.font=[UIFont fontWithName:@"HelveticaNeue" size:26];
    self.autoresizingMask=UIViewAutoresizingFlexibleRightMargin;
}

@end

现在创建此MyLabel的一个对象,您的属性将自动设置,并且只需通过故事板将此类分配给您的标签到单元格中的标签。

子类化是实现可重用代码的最佳方式。

否则你甚至可以在某个类中创建类的扩展甚至类方法,它接受UILabel并设置属性,但这些都不是最佳实践。扩展程序的另一个问题是,您只能使用self而不能使用super。当您必须扩展属性时,这可能会在将来产生问题。

我希望我很清楚,乐于助人。

答案 1 :(得分:2)

您可以使用此方法将UITabelViewCell的所有标签设为同一属性

这里只循环子视图并检查子视图是否为UILabel,如果是UILabel,则设置所需的属性。

我的代码:

- (void)formatTheLabelForCell:(UITableViewCell *)cell
{
    for (UIView *view in cell.contentView.subviews) {
        if ([view isKindOfClass:[UILabel class]]) {
            UILabel *lbl = (UILabel *)view;

            lbl.backgroundColor = [UIColor colorWithRed:0 green:0.188235 blue:0.313725 alpha:1];
            lbl.textColor=[UIColor whiteColor];
            lbl.font=[UIFont fontWithName:@"HelveticaNeue" size:26];
            lbl.autoresizingMask=UIViewAutoresizingFlexibleRightMargin;
        }
    }
}

答案 2 :(得分:2)

不是在import EEGrunt source = 'openbci' path = 'C:/Users/Vedant/Desktop/Pygaze/OpenBCI_2/application.windows64/SavedData/' filename = 'OpenBCI-RAW-2016-11-28_16-23-14.txt' session_title = "OpenBCI EEGrunt Test Data" EEG = EEGrunt.EEGrunt(path, filename, source, session_title) EEG.plot = 'show' EEG.load_data() for channel in EEG.channels: EEG.load_channel(channel) print("Processing channel "+ str(EEG.channel)) EEG.remove_dc_offset() EEG.notch_mains_interference() EEG.signalplot() EEG.get_spectrum_data() EEG.data = EEG.bandpass(start, stop) EEG.spectrogram() EEG.plot_band_power(8,12,"Alpha") EEG.plot_spectrum_avg_fft() EEG.showplots() 中配置单元格,而是使用自定义单元格更好。添加cellForRowAtIndexPath&你的Storyboard / Nib本身就是imageView。这样,所有单元格都使用这些默认属性生成。此外,如果您需要通过代码配置某些内容,可以在CustomCell.m文件中对其进行编码,如下所示:

separatorLineView

编辑:从网上下载图片可能是长时间加载单元格的原因。尝试异步下载图像。您也可以使用此库:SDWebImage

注意:我知道你想要它在Objective C中,上面Swift中的代码只是为了说明。

答案 3 :(得分:2)

  

至于swift,你可以这样做,它会将你应用于textLabel的所有属性复制到detailTextLabel。

 cell.detailTextLabel.attributedText = cell.textLabel.attributedText

答案 4 :(得分:2)

首先,我不认为有一个功能可以复制iOS SDK中任何UIKit组件的特定属性。因此,您必须为此编写自定义函数。此外,您的" cellForRowAtIndexPath"还存在一些问题。正如其他人在评论中指出的那样。

对此有不同的解决方案。

解决方案1: 在视图控制器中编写一个函数,它将两个标签作为参数并复制您想要的值。

-(void)copyPropertiesFrom:(UILabel*)label1 toLabel:(UILabel*)label2{
    label2.backgroundColor  = label1.backgroundColor;
    label2.textColor        = label1.textColor;
    label2.font             = label1.font;
    label2.autoresizingMask = label1.autoresizingMask;
}

在要复制的cellForRowAtIndexPath中执行此操作

[self copyPropertiesFrom:cell.titleLabel toLabel:cell.detailTextLabel];

解决方案2(推荐):这是我最好的经验,因为您可以在其他视图控制器中重复使用它。可能有比这更好的方法。

创建一个UILabel类别。请查看此链接How do I create a category in Xcode 6 or higher?以及此https://code.tutsplus.com/tutorials/objective-c-categories--mobile-10648

您在类别中的功能将如下所示。

-(void)formatLabelToMyStyle{
    self.backgroundColor    = [UIColor colorWithRed:0 green:0.188235 blue:0.313725 alpha:1];
    self.textColor          = [UIColor whiteColor];
    self.font               = [UIFont fontWithName:@"HelveticaNeue" size:26];
    self.autoresizingMask   = UIViewAutoresizingFlexibleRightMargin;
}

您将包含类别的头文件,并在您的cellForRowAtIndexPath中调用此函数,如下所示

[cell.titleLabel formatLabelToMyStyle];
[cell.detailTextLabel formatLabelToMyStyle];
[cell.customTextLabel formatLabelToMyStyle];

至于你的cellForRowAtIndexPath,注释中提到的larme"不要在单元格中添加类似的子视图,因为细胞被重复使用"这将继续为您的单元格添加视图,从而导致内存问题,特别是当您有大量的单元格时,在您的情况下是真的。

答案 5 :(得分:2)

您可以Category使用UILabel或使用应该共享相同样式的UILabel子类。

Category的{​​{1}}可能如下所示:

UILabel

.m文件:

// UILabel+CustomStyle.h
#import <UIKit/UIKit.h>

@interface UILabel (CustomStyle)
-(void) applyCustomStyle;
@end

然后您可以通过简单地调用:

来应用相同的样式
// UILabel+CustomStyle.m
#import "UILabel+CustomStyle.h"

@implementation UILabel (CustomStyle)

-(void) applyCustomStyle {
    self.backgroundColor = [UIColor colorWithRed: 0 green: 0.188235 blue: 0.313725 alpha: 1];
    self.textColor = [UIColor whiteColor];
    self.font = [UIFont fontWithName: @"HelveticaNeue" size: 26];
    self.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
}

@end

答案 6 :(得分:2)

如果要对项目中的许多位置使用相同的标签配置。只是作为@NikhilManapure的子类说。

OR

如果要将相同的属性应用于 TableViewCell textLabel detailTextLabel 。您应该创建TableViewCell的子类并在drawrect方法中覆盖Label属性。

目标-C

        #import <UIKit/UIKit.h>

        @interface PropertiesCell : UITableViewCell

        @end

        #import "PropertiesCell.h"

        @implementation PropertiesCell

        - (void)awakeFromNib {
            [super awakeFromNib];
            // Initialization code
        }

        - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
            [super setSelected:selected animated:animated];

            // Configure the view for the selected state
        }

        - (void)drawRect:(CGRect)rect {
            [super drawRect:rect];
            [self cellLabelConfigure:self.textLabel];
            [self cellLabelConfigure:self.detailTextLabel];
        }

        - (void)cellLabelConfigure:(UILabel*) contentLabel {
            contentLabel.backgroundColor = [UIColor colorWithRed:0 green:0.188235 blue:0.313725 alpha:1];
            contentLabel.textColor=[UIColor whiteColor];
            contentLabel.font=[UIFont fontWithName:@"HelveticaNeue" size:26];
            contentLabel.autoresizingMask=UIViewAutoresizingFlexibleRightMargin;
        }

        @end

夫特

 class PropertiesCell: UITableViewCell {
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        cellLabelsConfigure(contentLabel: self.textLabel)
        cellLabelsConfigure(contentLabel: self.detailTextLabel)
    }

    func cellLabelsConfigure(contentLabel: UILabel?) {
        contentLabel?.backgroundColor = UIColor(red: 0.0, green: 0.188, blue: 0.313, alpha: 1.0)
        contentLabel?.textColor = UIColor.white
        contentLabel?.font = UIFont(name: "HelveticaNeue", size: 26.0)
        contentLabel?.autoresizingMask = UIViewAutoresizing.flexibleRightMargin
    }
}

在故事板中将单元格类名称更改为 PropertiesCell

enter image description here

答案 7 :(得分:1)

创建扩展类并使用此copy方法将所需的所有属性传递给新标签。

@implementation UILabel (Copy)

- (UILabel *)copyProperties {
    UILabel *label = [UILabel new];
    [self copyPropertiesWithLabel:label];
    return label;
}

- (void)copyPropertiesWithLabel:(UILabel *)label {
    label.backgroundColor = self.backgroundColor;
    label.textColor = self.textColor;
    label.font = self.font;
    label.autoresizingMask = self.autoresizingMask;
    // Add more properties
}

@end

用法:

// cell.textLabel has now all the properties
[theLabelToBeCopied copyPropertiesWithLabel:cell.textLabel];