覆盖对象实例的方法

时间:2013-07-30 15:56:48

标签: objective-c inheritance override uitableview

我正在尝试覆盖从setFrame继承的类中的UITableViewCell UITableViewController方法。我发现这个方法覆盖了this question的答案,但我不知道如何实现覆盖以使其工作。

以下是我要实现的覆盖:

- (void)setFrame:(CGRect)frame {
    int inset = 1;
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

这是我想在下面使用覆盖的类:

@interface PeopleTableViewController : UITableViewController 
{
}

@end

previous answer表示继承UITableViewCell以覆盖该方法。我该怎么做?提前致谢

编辑:这是使用UITableViewCell的地方。

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                      reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    //USE TO SET CELL IMAAGE BACKGROUND

    cell.backgroundView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"basketball.png"] 
                            stretchableImageWithLeftCapWidth:0.0 
                                                topCapHeight:5.0]];

    cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"basketball.png"] 
                                    stretchableImageWithLeftCapWidth:0.0 
                                                        topCapHeight:5.0]];

    [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];


    return cell;
}

2 个答案:

答案 0 :(得分:0)

您应该在UITableViewCell子类中执行此操作,这是最简单,最安全的选项。

如果你想在视图控制器中出于某种原因(你可能会破坏很多东西),你需要使用方法调配(因为你想调用super所以使用赢得的类别&#39 ;工作)。

答案 1 :(得分:0)

这里的主要问题是您正在查看UITableViewController子类。如果您继承UITableViewCell,您将获得一些默认方法实现。只需在实现的某处添加setFrame覆盖,如下所示:

#import "MyTableViewCellSubclass.h"

@implementation MyTableViewCellSubclass

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

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

    // Configure the view for the selected state 
}

// YOUR ADDED setFrame OVERRIDE
- (void)setFrame:(CGRect)frame {
    int inset = 1;
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

@end

只是为了给你一些思考的东西。 UIViewController没有框架。他们只是控制视图(因此“viewController”)。视图有框架。希望这有助于您理解为什么我们将setFrame覆盖放在视图类而不是控制器类中。