0

tableViewにセルを追加しようとしています

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *MyIdentifier = @"MyIdentifier";
        UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
        cell.accessoryType = UITableViewCellAccessoryNone;
        [cell setSelectionStyle:UITableViewCellEditingStyleNone];
        // Set up the cell

        cell.backgroundColor = [UIColor clearColor];
        UIButton *buyBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        UIImageView *img;
        UILabel *lbl;
        UIImageView *backImage;
        UILabel *textLabel;
        UILabel *detailTextLabel;

        NSInteger val = [indexPath row] * 3;

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            //*buyBtn = [[UIButton alloc] initWithFrame:CGRectMake(x, y, w, h)];
            [buyBtn setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];

            //*img = [[UIImageView alloc] initWithFrame:CGRectMake(x, y, w, h)];
            [img setImage:[UIImage imageNamed:@""]];
            //*lbl = [[UILabel alloc] initWithFrame:CGRectMake(x,y,w,h)];
        }
        else
        {
            backImage =  [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)];
            [buyBtn setFrame:CGRectMake(257, 100, 57, 24)];
            img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 75, 57, 24)];

            lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)];
            textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)];
            detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)];

            backImage.image = [UIImage imageNamed:@"shop-bg.png"];
            [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal];
            [img setImage:[UIImage imageNamed:@"price_button.png"]];

            lbl.center = img.center;
            lbl.textAlignment =  UITextAlignmentCenter;
            lbl.text = [self.original_List objectAtIndex:val+2];
            lbl.backgroundColor = [UIColor clearColor];

            textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:14];
            textLabel.backgroundColor = [UIColor clearColor];
            textLabel.text = [self.original_List objectAtIndex:val];

            detailTextLabel.text = [self.original_List objectAtIndex:val+1];
            detailTextLabel.backgroundColor = [UIColor clearColor];
            detailTextLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:10];
            textLabel.textColor = [UIColor blackColor];
            detailTextLabel.textColor = [UIColor whiteColor];
            detailTextLabel.numberOfLines = 2;
        }

        [buyBtn setTag:[indexPath row]];
        [buyBtn addTarget:self action:@selector(buyBtnPressed:) forControlEvents:UIControlEventTouchDown];
        [cell addSubview:backImage];
        [cell addSubview:detailTextLabel];
        [cell addSubview:textLabel];
        [cell addSubview:buyBtn];
        [cell addSubview:img];
        [cell addSubview:lbl];

        return cell;
    }

図から、最初のセルには追加された画像、ラベル、ボタンが含まれていないことがわかりますが、他のセルをスクロールすると、表示されなくなったセルは透明になり、表示されているセルは問題ありません。

3つのサブビューが最初のセルから追加されないのはなぜですか。textLabelとdetailTextLabelが適切に追加されます。

ここに画像の説明を入力してください

4

4 に答える 4

1

まず、セルをデキューせず、再利用せずに常に新しいセルを作成します。次のようなものを追加してみてください(自動リリースが必要かどうかはわかりません。ARCを使用する天気によって異なります)。

RecentsTableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
        cell = [[[RecentsTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                            reuseIdentifier:cellIdentifier] autorelease];
}

次に、ARC(自動参照カウント)を使用していない場合は、ここに大量の参照が失われます。

[[Class alloc] init]は参照を追加し、addSubviewも参照を追加します。xcodeの「analyse」ビルドがこれについて何を言っているのか疑問に思います。

第三に、セルに追加したすべてのラベルには、行数などだけでなく、設定するための「フレーム」プロパティも必要です。

于 2013-01-03T09:44:31.167 に答える
0

前の答えは正しいですが、修正できるものは他にもあります。

サブビューを追加するコードの部分は、セルがデキューされていない場合にのみ呼び出す必要があります。それ以外の場合は、同じボタン、ビューなどの複数のインスタンスを追加することになります。

[cell addSubview:backImage];
[cell addSubview:detailTextLabel];
[cell addSubview:textLabel];
[cell addSubview:buyBtn];
[cell addSubview:img];
[cell addSubview:lbl];

また、セルに直接追加するのではなく、cell.contentViewに追加する方が良いと思います。したがって、次のようになります。

RecentsTableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[[RecentsTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                        reuseIdentifier:cellIdentifier] autorelease];

    /*Create your subviews here*/

    [cell.contentView addSubview:backImage];
    [cell.contentView addSubview:detailTextLabel];
    [cell.contentView addSubview:textLabel];
    [cell.contentView addSubview:buyBtn];
    [cell.contentView addSubview:img];
    [cell.contentView addSubview:lbl];
}

// Below just set properties of existing subviews of the cell: color, textColor, text etc.
// You need to retrieve them and one way is to assign them to properties in 
// RecentsTableViewCell or set the tag property of the subviews and retrieve
// them using e.g. [cell.contentView viewWithTag:kBuyButtonTag].
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    ...
}
else {
    ...
}
于 2013-01-03T10:11:39.623 に答える
0

これが私がそれをした方法の例です。必要なもの(私の場合はCopyableCell)から派生したセルクラスを作成しました。

これは*.hファイルです。

#import <UIKit/UIKit.h>
#import "CopyableCell.h"

@interface RecentsTableViewCell : CopyableCell

@property (readonly, retain) UILabel *titleLabel;
@property (readonly, retain) UILabel *detailsLabel;
@property (readonly, retain) UILabel *subdetailsLabel;
@property (readonly, retain) UILabel *subtitleLabel;

@end

これが*.mファイルです。

#import "RecentsTableViewCell.h"

@interface RecentsTableViewCell ()

// Redeclare property as readwrite
@property (readwrite, retain) UILabel *titleLabel;
@property (readwrite, retain) UILabel *subtitleLabel;
@property (readwrite, retain) UILabel *detailsLabel;
@property (readwrite, retain) UILabel *subdetailsLabel;

@end

@implementation RecentsTableViewCell

@synthesize titleLabel;
@synthesize subtitleLabel;
@synthesize detailsLabel;
@synthesize subdetailsLabel;

- (void) layoutSubviews
{
        int leftMargin = 30;
        int rightMargin = 6;

        [super layoutSubviews];

        CGRect cellRect = self.contentView.frame;
        int width = cellRect.size.width - (leftMargin + rightMargin);

        CGSize constraintSize = CGSizeMake(300, MAXFLOAT);
        CGSize titleSize = [titleLabel.text sizeWithFont:titleLabel.font
                                       constrainedToSize:constraintSize
                                 lineBreakMode:UILineBreakModeTailTruncation];
        CGSize detailsSize = [detailsLabel.text sizeWithFont:detailsLabel.font
                                           constrainedToSize:constraintSize
                                     lineBreakMode:UILineBreakModeTailTruncation];

        if (titleSize.width > titleLabel.frame.size.width ||
            detailsSize.width > detailsLabel.frame.size.width) {
                CGRect detailsFrame = detailsLabel.frame;
                detailsFrame.size.width = detailsSize.width;
                detailsFrame.origin.x = cellRect.size.width -
                        (detailsSize.width + subdetailsLabel.frame.size.width + rightMargin);

                CGRect titleFrame = titleLabel.frame;
                titleFrame.size.width = width - detailsSize.width - subdetailsLabel.frame.size.width - 5;

                titleLabel.frame = titleFrame;
                detailsLabel.frame = detailsFrame;
        }
}

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
                CGRect cellRect = self.contentView.frame;
                cellRect.size.height = 61;
                self.contentView.frame = cellRect;

                int leftMargin = 30;
                int rightMargin = 6;
                int x = cellRect.origin.x + leftMargin;
                int y = cellRect.origin.y;
                int width = cellRect.size.width - (leftMargin + rightMargin);
                int height = cellRect.size.height;

                int titleWidth = width * 0.75;
                int alldetailsWidth = width - titleWidth;
                int detailsWidth = alldetailsWidth * 0.65;
                int subdetailsWidth = alldetailsWidth - detailsWidth;

                int titleHeight = height * 0.38;
                int subtitleHeight = height - titleHeight;

                self.titleLabel = [[[UILabel alloc]
                                    initWithFrame:CGRectMake(x, y, titleWidth, titleHeight)] autorelease];
                self.titleLabel.font = [UIFont boldSystemFontOfSize:18.0f];
                self.titleLabel.highlightedTextColor = self.textLabel.highlightedTextColor;
                self.titleLabel.textAlignment = UITextAlignmentLeft;
                self.titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth |
                        UIViewAutoresizingFlexibleBottomMargin;
                [self.contentView addSubview:titleLabel];

                self.detailsLabel = [[[UILabel alloc]
                                 initWithFrame:CGRectMake(cellRect.size.width -
                                                          (detailsWidth + subdetailsWidth + rightMargin),
                                                          y + 4, detailsWidth, titleHeight - 4)] autorelease];
                self.detailsLabel.font = [UIFont boldSystemFontOfSize:13.0f];
                self.detailsLabel.textColor = [UIColor colorWithRed:0.12 green:0.439 blue:0.847 alpha:1];
                self.detailsLabel.textAlignment = UITextAlignmentRight;
                self.detailsLabel.highlightedTextColor = self.textLabel.highlightedTextColor;
                self.detailsLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
                        UIViewAutoresizingFlexibleHeight;
                [self.contentView addSubview:detailsLabel];

                self.subdetailsLabel = [[[UILabel alloc]
                                initWithFrame:CGRectMake(cellRect.size.width - (subdetailsWidth + rightMargin),
                                                         y + 6, subdetailsWidth, titleHeight - 6)] autorelease];
                self.subdetailsLabel.font = [UIFont systemFontOfSize:11.0f];
                self.subdetailsLabel.textColor = [UIColor colorWithRed:0.12 green:0.439 blue:0.847 alpha:1];
                self.subdetailsLabel.textAlignment = UITextAlignmentCenter;
                self.subdetailsLabel.highlightedTextColor = self.textLabel.highlightedTextColor;
                self.subdetailsLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
                        UIViewAutoresizingFlexibleHeight;
                [self.contentView addSubview:subdetailsLabel];

                self.subtitleLabel = [[[UILabel alloc]
                                  initWithFrame:CGRectMake(x, y + titleHeight, width, subtitleHeight - 2)] autorelease];
                self.subtitleLabel.highlightedTextColor = self.textLabel.highlightedTextColor;
                self.subtitleLabel.font = [UIFont systemFontOfSize:13.0f];
                self.subtitleLabel.textColor = [UIColor darkGrayColor];
                self.subtitleLabel.numberOfLines = 2;
                self.subtitleLabel.lineBreakMode = UILineBreakModeTailTruncation;
                self.subtitleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth |
                        UIViewAutoresizingFlexibleTopMargin;
                [self.contentView addSubview:subtitleLabel];

                self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }
        return self;
}

- (id) init
{
        return [self initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"RecentsCell"];
}

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

- (void) dealloc
{
        self.titleLabel = nil;
        self.subtitleLabel = nil;
        self.detailsLabel = nil;
        self.subdetailsLabel = nil;
        [super dealloc];
}

@end

私はARCを使用していないので、このコードを使用する場合は、それに応じて変更してください。これが、テーブルビューコントローラでこのクラスを使用する方法です。

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        static NSString *cellIdentifier = @"TransactionCell";
        NSMutableArray *data = searching ? searchResult : dataSource;
        NSDictionary *object = [data objectAtIndex:[indexPath row]];

        RecentsTableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (cell == nil) {
                cell = [[[RecentsTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                                    reuseIdentifier:cellIdentifier] autorelease];
        }
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
        cell.indexPath = indexPath;
        cell.delegate = self;

        cell.titleLabel.text = @"Transaction title";
        if (pendingTransaction) {
                cell.titleLabel.textColor = [UIColor grayColor];
                cell.titleLabel.font = [UIFont systemFontOfSize:cell.titleLabel.font.pointSize];
        } else {
                if (!isGreen)
                        cell.titleLabel.textColor = [UIColor colorWithRed:0.733 green:0.098
                                                                     blue:0.098 alpha:1];
                else
                        cell.titleLabel.textColor = cell.textLabel.textColor;
                cell.titleLabel.font = [UIFont boldSystemFontOfSize:cell.titleLabel.font.pointSize];
        }
        cell.subtitleLabel.text = @"Transaction subtitle";
        cell.detailsLabel.text = @"Some details like location";
        cell.subdetailsLabel.text = @"200 USD";
        return cell;
}

これにより、iPhone通話アプリに表示されるものと非常によく似たテーブルが作成されます。つまり、タイトル、サブタイトル、セルの右端の位置にある青色のサブディテールなどです。

アプリストアのTorchooアプリで確認できます。使用は無料で、テストアカウントを使用してログインし、例として見ることができます。

これが少し役立つことを願っています。

于 2013-01-03T10:00:03.867 に答える
0

subViewを削除せずに、セルにsubViewを継続的に追加していますか?私が書いた正確ではないコードのようなsubViewを追加しながら条件を確認してください:

  if ([[cell.contentView subviews] count]==0) {
  [self.contentView addSubview:imageView];
 }

セルコンテンツビューにそのビューが含まれていない場合は、追加します。

于 2013-01-03T10:10:46.293 に答える