繁体   English   中英

实现UITableView的父类的子类未返回数据源,引发异常

[英]Datasource not returned by sub class of parent class implementing UITableView, throwing exception

我想在UITableView中显示一些不同类别的媒体(例如mostViewed,加星标)。 我创建了APPParentViewController ,它实现了UITableViewDataSourceUITableViewDelegate协议。 APPParentViewController cellForRowAtIndexPath方法中,我返回相应的单元格,该单元格中填充有来自数组的数据。

该数组实际上是在APPParentViewController的子类的init方法中实例化的,我示例性地将其称为APPChildViewController 每个媒体类别都有一个APPChildViewController 它们只是数组的实例化方式不同,可以说数组的内容。

我在另一个UIViewController( [[APPChildViewController alloc] init] )中实例化所有APPChildViewController类,然后最初选择一个APPChildViewController进行查看(所有操作都在该UIViewController的viewDidLoad方法中进行)。 到目前为止工作。

但是,当我只想通过删除旧视图并添加所请求的视图(当用户通过按下按钮来请求它时)来显示另一个APPChildViewController时,会出现以下异常:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' ***

这是我正在使用的代码(我删除了所有不重要的内容,因此希望它仍然可以理解):

APPParentViewController.h

#import <UIKit/UIKit.h>

@interface APPParentViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (strong, nonatomic) NSArray *media;
@property (strong, nonatomic) UITableView *tableView;
@end

APPParentViewController.m

#import "APPParentViewController.h"
#import "APPCell.h"

@interface APPParentViewController ()
@end

@implementation APPParentViewController
@synthesize media;
@synthesize tableView;

-(void)viewDidLoad
{
     self.tableView = [[UITableView alloc] init];
     [self.view addSubview:self.tableView];

     self.tableView.delegate = self;
     self.tableView.dataSource = self;
}

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     return [self.media count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *CellTableIdentifier = @"CellTableIdentifier";
     static BOOL nibsRegistered = NO;
     if (!nibsRegistered) {
         UINib *nib = [UINib nibWithNibName:@"APPCell" bundle:nil];
         [self.tableView registerNib:nib forCellReuseIdentifier:CellTableIdentifier];
         nibsRegistered = YES;
     }

     APPCell *cell = [self.tableView dequeueReusableCellWithIdentifier: CellTableIdentifier];
     NSUInteger row = [indexPath row];
     NSDictionary *rowData = [self.media objectAtIndex:row];
     cell.title = [rowData objectForKey:@"Title"];
     return cell;
}
@end

APPChildViewController.h

#import "APPParentViewController.h"
@interface APPChildViewController : APPParentViewController
@end

APPChildViewController.m

#import "APPChildViewController.h"
#import "APPCell.h"

@interface APPChildViewController ()
@end

@implementation APPChildViewController

- (id)init
{
     self = [super init];
     if (self) {
          self.media = fill array...
     }
     return self;
}

当我将cellForRowAtIndexPath方法实现复制到所有子类时,它实际上可以工作,但这显然不是继承的工作方式。

进行切换时,某些单元格将引用大孩子的媒体,并且如果该对象消失了,哦:

NSDictionary *rowData = [self.media objectAtIndex:row];

尽快切换dataSource,您是否要发送:

 [self.tableView reloadData];

我假设(希望!)您只有父母拥有的一个笔尖...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM