2013-07-30 3 views
0

Я пытаюсь переопределить метод setFrameUITableViewCell внутри класса, который наследует от UITableViewController. Я нашел этот метод переопределенным как ответ this question, но я не знаю, как реализовать переопределение, чтобы заставить его работать.Метод переопределения объекта Object

Вот переопределение я хочу реализовать:

- (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 переопределить метод. Как и где я это делаю? Заранее спасибо

EDIT: Здесь используется 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; 
} 
+0

Почему вы хотите переопределить его в контроллере? – Wain

+0

Вы переопределите метод класса, написав подкласс класса THAT, а не какой-либо другой класс. –

ответ

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 s не имеют фреймов. Они просто контролируют представления (отсюда «viewController»). В представлениях есть кадры. Надеюсь, это поможет вам понять, почему мы помещаем переопределение в класс представления, а не в класс контроллера.

+0

Итак, если я создаю подкласс UITableViewCell с именем MyTableViewCell и заменяю ячейку UITableViewCell * MyTableViewCell, будет ли все другой автоматически вставленный код, который уже работал? Я отправлю метод, о котором я говорю, – JaaMills

+0

Он должен, да. Если вы не переопределите метод в подклассе, он просто будет использовать суперкласс по умолчанию. Поэтому в этом случае, если вы не переопределяете что-либо еще, оно будет действовать так же, как 'UITableViewCell' (за исключением установки рамки, потому что вы его перевернули) – Firo

+0

Спасибо! Работал так же, как вы сказали. Извините, если это был вопрос новобранец, подумал, что это будет сложно, поскольку первое, что я посмотрел, - это множественное наследование. Оцените быстрый ответ:] – JaaMills

0

Вы должны сделать это в UITableViewCell подкласса, это самый простой и безопасный вариант.

Если вы хотите сделать это в контроллере представления по какой-либо причине (вы рискуете сломать несколько вещей), вам нужно будет использовать метод swizzling (потому что вы хотите вызвать super, поэтому использование категории не будет работать).

Смежные вопросы