UITableViewCell подкласс

У меня есть этот сегмент кода:

if (cell == nil)
{
    CGRect cellFrame = CGRectMake(0,0,300,250);
    cell = [[UITableViewCell alloc] initWithFrame:cellFrame
            reuseIdentifier:CellTableIndetifier];

    CGRect nameLabelRect = CGRectMake(0, 5, 70, 20);
    UILabel* nameLabel = [[UILabel alloc] initWithFrame:nameLabelRect];
    nameLabel.textAlignment = NSTextAlignmentCenter;
    nameLabel.text = @"Name";
    nameLabel.font = [UIFont boldSystemFontOfSize:12];
    [cell.contentView addSubview: nameLabel];

    CGRect colorLabelRect = CGRectMake(0, 25, 70, 20);
    UILabel* colorLabel = [[UILabel alloc] initWithFrame:colorLabelRect];
    colorLabel.textAlignment = NSTextAlignmentCenter;
    colorLabel.text = @"Color";
    colorLabel.font = [UIFont boldSystemFontOfSize:12];
    [cell.contentView addSubview: colorLabel];

    CGRect priceLabelRect = CGRectMake(0, 45, 70, 20);
    UILabel *priceLabel = [[UILabel alloc] initWithFrame:priceLabelRect];
    priceLabel.text = @"Price";
    priceLabel.textAlignment = NSTextAlignmentCenter;
    colorLabel.font = [UIFont boldSystemFontOfSize:12];
    [cell.contentView addSubview:priceLabel];

    CGRect nameValueRect = CGRectMake(80, 5, 200, 20);
    UILabel* nameValue = [[UILabel alloc] initWithFrame: nameValueRect];
    nameValue.tag = kNameValueTag;
    [cell.contentView addSubview:nameValue];

    CGRect colorValueRect = CGRectMake(80, 25, 200, 20);
    UILabel* colorValue = [[UILabel alloc] initWithFrame:colorValueRect];
    colorValue.tag = kColorValueTag;
    [cell.contentView addSubview:colorValue];

    CGRect priceValueRect = CGRectMake(80, 45, 200, 20);
    UILabel *priceValue = [[UILabel alloc] initWithFrame:priceValueRect];
    priceValue.tag = kPriceValueTag;
    [cell.contentView addSubview:priceValue];
}

и я хотел бы превратить это в подкласс, так что я неЯ должен написать все эти строки, я просто говорю, что cell = CustomCell, и он делает все в подклассе.

 Martin R21 июн. 2013 г., 14:23
@trojanfoe: я нене понимаю ваш первый комментарий. Все положения меток (относительно ячейки) и тегов идентичны для каждой ячейки, поэтому это можно сделать в подклассе.initWithStyle:reuseIdentifier: метод. - Возможно, я что-то упускаю.
 trojanfoe21 июн. 2013 г., 14:25
@MartinR Ректы, используемые для позиционирования меток, выглядят по-разному для меня, но я вижу, как все это теперь можно вставить в метод инициализации ячейки.
 woz21 июн. 2013 г., 14:22
Вы гуглили несколько уроков?
 Lord Zsolt21 июн. 2013 г., 14:16
Я вроде неНе знаю, чтобы создать подкласс. Я'Я немного новичок в Xcode, поэтому я неЯ полностью не понимаю синтаксис.
 woz21 июн. 2013 г., 14:14
С какой частью подкласса у вас возникают проблемы?
 trojanfoe21 июн. 2013 г., 14:16
Это'мне не очевидно, как подклассификация может помочь; вам все еще нужно расположить ячейку и назначить теги, которые уникальны для каждой ячейки ...
 Bhavesh Nayi21 июн. 2013 г., 14:16
какие'это проблема ??
 trojanfoe21 июн. 2013 г., 14:17
Вы имеете в виду, что вы новичок в Objective-C; XCode является IDE и нене иметь "синтаксис", Вы должны удалить Xcode из заголовка этого вопроса. (H2CO3 будет здесь в любую минуту, так что будьте быстры) ...
 Martin R21 июн. 2013 г., 14:28
@trojanfoe: одна ячейка имеет 5 меток (конечно, с разными позициями). Но это одинаковые позиции для каждой создаваемой ячейки, поэтому весь код для создания отдельной ячейки можно поместить в метод подкласса initXXX.

Ответы на вопрос(5)

Решение Вопроса

Вот основной код для подкласса UITableCellView:

#import 

@interface CustomCell : UITableViewCell
{
}
@end


-----------------------------------------------------------


#import "CustomCell.h"

@implementation CustomCell


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)layoutSubviews{
    [super layoutSubviews];
}

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

    // Configure the view for the selected state
}*/

@end

Это автоматически генерируется, если вы создаете новый файл типаObjective-C Class и указатьUITableViewCell в полеsubclass of

Есть два способа, которыми я пользуюсь, чтобы решить эту проблему.

"быстро и грязно" это разработатьUITableViewCell в вашUITableView с тем, что вам нужно (,UILabelUIImageView, ...) и установите уникальный тег для каждого элемента, а затем, когда вы удаляетеUITableViewCell Вы можете повторно использовать элементы следующим образом:

UILabel *nameLabel = (UILabel*)[cell viewWithTag:NAME_LABEL_TAG];

if(!nameLabel) {

    // If the label does not exist, create it
    CGRect nameLabelRect = CGRectMake(0, 5, 70, 20);
    nameLabel = [[UILabel alloc] initWithFrame:nameLabelRect];
    nameLabel.textAlignment = NSTextAlignmentCenter;
    nameLabel.text = @"Name";
    nameLabel.font = [UIFont boldSystemFontOfSize:12];
    [cell.contentView addSubview: nameLabel];
}

Или (IMO) лучший способ заключается в создании пользовательскихUITableViewCell и подклассUItableviewCell, у вас есть хороший учебник там:Пользовательский UITableViewCell

Я обычно делаю следующее. Если вы используете ячейку только в 1 контроллере представления, вы можете просто поместить ее в тот же файл, что и контроллер представления.

@interface MyCell : UITableViewCell

@property (strong, nonatomic) UILabel* nameValue;
@property (strong, nonatomic) UILabel* colorValue;
@property (strong, nonatomic) UILabel* priceValue;

@end

@implementation MyCell

-(id)init {
    self = [super initWithStyle:whatever_style];

    // Create & position UI elements
    UILabel* nameLabel = [[UILabel alloc] init];
    nameLabel.frame = .... // frame, font, etc
    [self.contentView addSubview:nameLabel]

    self.nameValue = [[UILabel alloc] init];
    self.nameValue = .... // frame, font, etc
    [self.contentView addSubview:self.nameValue];

    // Do the same thing for color, price

    return self;
}

@end

Обнажая,nameValuecolorValuepriceValueЯ разрешаю их изменять извне (то есть UITableViewController). Я не't выставлять другие метки, потому что они статичны. Если вам не нужно специальное позиционирование, вы ненадо переопределить.layoutSubviewsautoresizingMask достаточно в большинстве случаев.

 confile18 июн. 2015 г., 02:22
Почему Дон'использовать self.contentView вместо self для добавления подпредставлений?
 ColdSteel19 янв. 2015 г., 10:29
Но, как я могу знать клеткукадр?
#import "CellVideo.h"

@implementation CellVideo

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
    NSLog(@"initWithCoder");
    self = [super initWithCoder: aDecoder];
    if (self)
    {
        // Initialization code


        MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] init];
        [moviePlayer.view setFrame:CGRectMake(10, 75, 300, 260)];
        [moviePlayer.view setBackgroundColor:[UIColor blackColor]];
        [moviePlayer.view setTag:333];
        [moviePlayer setControlStyle:MPMovieControlStyleNone];
         moviePlayer.scalingMode = MPMovieScalingModeFill;
        _movie=moviePlayer;

        UIImageView *imagrViewThumb=[[UIImageView alloc]initWithFrame:CGRectMake(10, 75, 300, 260)];
        [imagrViewThumb setBackgroundColor:[UIColor redColor]];
        [imagrViewThumb setTag:333];

        [self.contentView insertSubview:imagrViewThumb atIndex:0];
    }
    return self;
}
-(void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    // Configure the view for the selected state
}


///use it in this way
 [email protected]"cellvideo";
UITableViewCell *cell=nil;
//  CellVideo *cellVideo=nil;

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

Я предполагаю, что вы помещаете этот материал в ваш метод cellForRowAtIndexPath: делегат, и я могу понять, почему вы стремитесь удалить его из этого места.

Создайте новый класс Objective-C через New->Создайте файл и поместите вызовы, связанные с подпредставлением, которые вы опубликовали в layoutSubviews: метод. В cellForRowAtIndexPath: в вашем табличном представлении делегат теперь использует этот класс вместо универсального UITableViewCell. Дон»не забудьте импортировать ваш недавно созданный файл.

Ваш ответ на вопрос