未调用Child的dataSource方法

时间:2015-02-10 10:12:19

标签: ios objective-c inheritance

我有一个名为ObjectA的父UITableViewController对象和派生的ObjectB。

我的目标: 覆盖cellForRowAtIndexPath:方法只改变单元格外观

正确调用ObjectA方法,所以:

  • numberOfRowsInSection:在父级,OK
  • 中调用
  • numberOfSectionsInTableView:在父级,OK
  • 中调用
  • cellForRowAtIndexPath:在父级中调用,错误

这就是我所做的:

/**
 * ObjectA
 */

@interface ObjectA : UITableViewController

@end

@implementation ObjectA

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return list.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    /* Layout by ObjectA rules */
}

@end

/**
 * ObjectB
 */

@interface ObjectB : ObjectA

@end

@implementation ObjectB

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    /* Layout by ObjectB rules */

    NOT CALLED
}

@end

修改

以编程方式分配对象,因此没有与IB声明相关的问题。

EDIT2:

我的代码很糟糕......我正在测试一个测试项目并且一切正常工作 ...抱歉

/**
 * ObjectA
 */

@interface ObjectA : UITableViewController {
    NSArray *list;
}
-(void)setList: (NSArray *)l;
@end

@implementation ObjectA

-(void)setList: (NSArray *)l {
    list = l;
    [self.tableView reloadData];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return list.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if(cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];

    cell.textLabel.text = [list objectAtIndex:indexPath.row];
    return cell;
}

@end

/**
 * ObjectB
 */

@interface ObjectB : ObjectA

@end

@implementation ObjectB

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if(cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];

    cell.textLabel.text = @"child";
    return cell;
}

@end

/**
 * View controller
 */

@interface ViewController() {
    NSArray *list;
    ObjectA *obj;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    list = @[@"test1", @"test2", @"test3", @"test4", @"test5"];
    obj = [[ObjectB alloc] initWithStyle:UITableViewStylePlain];

    obj.view.frame = self.view.frame;
    [self.view addSubview:obj.view];

    [obj setList:list];
}

1 个答案:

答案 0 :(得分:0)

在对象中覆盖>

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [super numberOfSectionsInTableView:tableView];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [super tableView:tableView numberOfRowsInSection:section];
}

适合我:

ObjectB *objA = [[ObjectB alloc] init];
objA.list = @[@"1"];
[self presentViewController:objA animated:YES completion:nil];