с подклассами TTTableMessageItemCell, что-то не так? - PullRequest
1 голос
/ 22 июля 2011

Я создал подкласс TTTableMessageItemCell, получил ошибку времени выполнения EXC_BAD_ACCESS.Что-нибудь не так?

CustomTTTableSubtitleItemCell.h

#import "Three20/Three20.h"
@interface CustomTTTableSubtitleItemCell : TTTableMessageItemCell {
    TTButton *_rightButton;
}

@end

CustomTTTableSubtitleItemCell.m

#import "CustomTTTableSubtitleItemCell.h"
#import "CustomTTTableSubtitleItem.h"
#import "XYDefaultStyleSheet.h"
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////

static CGFloat kHPadding = 10;
static CGFloat kVPadding = 15;


@interface ButtonStyleSheet : TTDefaultStyleSheet
@end

@implementation ButtonStyleSheet

- (TTStyle*)blueToolbarButton:(UIControlState)state {
    TTShape* shape = [TTRoundedRectangleShape shapeWithRadius:4.5];
    UIColor* tintColor = RGBCOLOR(30, 110, 255);
    return [TTSTYLESHEET toolbarButtonForState:state shape:shape tintColor:tintColor font:nil];
}

@end


@implementation CustomTTTableSubtitleItemCell


+ (CGFloat)tableView:(UITableView*)tableView rowHeightForItem:(id)item {
    CustomTTTableSubtitleItem* captionedItem = item;

    CGFloat maxWidth = tableView.width - kHPadding*2;

    CGSize titleSize = [captionedItem.title sizeWithFont:TTSTYLEVAR(myTitleFont)
                                     constrainedToSize:CGSizeMake(maxWidth, CGFLOAT_MAX)
                                         lineBreakMode:UILineBreakModeWordWrap];

    CGSize textSize = [captionedItem.text sizeWithFont:TTSTYLEVAR(myHeadingFont)
                                     constrainedToSize:CGSizeMake(maxWidth, CGFLOAT_MAX)
                                         lineBreakMode:UILineBreakModeWordWrap];
    CGSize subtextSize = [captionedItem.caption sizeWithFont:TTSTYLEVAR(mySubtextFont)
                                           constrainedToSize:CGSizeMake(maxWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];

    return kVPadding*2 + titleSize.height + textSize.height + subtextSize.height + kVPadding;
}




- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)identifier {
    if (self = [super initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:identifier]) {
        _item = nil;
        [TTStyleSheet setGlobalStyleSheet:[[[ButtonStyleSheet alloc] init] autorelease]];


    }
    return self;
}


- (void)layoutSubviews {
    [super layoutSubviews];

    [self.detailTextLabel sizeToFit];
    self.detailTextLabel.top = kVPadding;

    self.textLabel.height = self.detailTextLabel.height;

    //_rightButton.frame = CGRectMake(20, self.detailTextLabel.bottom + kVPadding, kImageWidth, kImageHeight);

        //_rightButton.alpha = !self.showingDeleteConfirmation;
        [_rightButton sizeToFit];
        _rightButton.left = self.contentView.width - (_timestampLabel.width + kHPadding);
        _rightButton.top = self.height/2;



}

- (id)object {
    return _item;
}

- (void)setObject:(id)object {
    if (_item != object) {
        [super setObject:object];

        CustomTTTableSubtitleItem* item = object;


        //self.textLabel.textColor = TTSTYLEVAR(myHeadingColor);
//      self.textLabel.font = TTSTYLEVAR(myHeadingFont);
//      self.textLabel.textAlignment = UITextAlignmentRight;
//      self.textLabel.contentMode = UIViewContentModeCenter;
//      self.textLabel.lineBreakMode = UILineBreakModeWordWrap;
//      self.textLabel.numberOfLines = 0;
//      
//      self.detailTextLabel.textColor = TTSTYLEVAR(mySubtextColor);
//      self.detailTextLabel.font = TTSTYLEVAR(mySubtextFont);
//      self.detailTextLabel.textAlignment = UITextAlignmentLeft;
//      self.detailTextLabel.contentMode = UIViewContentModeTop;
//      self.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;


        _rightButton = [TTButton 
                        buttonWithStyle:@"blueToolbarButton:" title:item.rightButtonTitle]; 




    }
}

- (void)dealloc {
    TT_RELEASE_SAFELY(_rightButton);
    [super dealloc];
}

@end

1 Ответ

0 голосов
/ 22 июля 2011

Вы создаете TTButton, используя авто-релиз, в то время как вы выпускаете его в своей функции dealloc. Таким образом, и пул релизов, и dealloc пытаются освободить вашу _BrightButton TTButton.

в заголовочном файле, попробуйте добавить:

@property (nonatomic, readonly, retain) TTButton*      rightButton;

А затем создайте TTButton, используя его функцию get в вашем исходном файле:

///////////////////////////////////////////////////////////////////////////////////////////////////
- (TTButton*)rightButton {
 if (!_rightButton) {
    _rightButton = [[TTButton 
                     buttonWithStyle:@"blueToolbarButton:" title:item.rightButtonTitle] retain]; 

    [self.contentView addSubview:rightButton];
  }
 return rightButton;
}

При использовании rightButton, убедитесь, что используете self.rightBotton, а не _rightButton, например, в функции макета (потому что вам нужно создать объект).

self.rightButton.frame = CGRectMake(20, self.detailTextLabel.bottom + kVPadding, kImageWidth, kImageHeight);

Я предлагаю открыть файл Three20UI / TTTableMessageItemCell.h & source и попытаться скопировать поведение одного из элементов. Вот что я сделал.

...