我想在UITableView中显示一些不同类别的媒体(例如,mostViewed,已加星标)。我创建了APPParentViewController
,它实现了UITableViewDataSource
和UITableViewDelegate
协议。在cellForRowAtIndexPath
中的APPParentViewController
方法中,我返回了适当的单元格,其中包含来自数组的数据。
数组实际上是在init
子类中的APPParentViewController
方法中实例化的,我将其称为APPChildViewController
。每种媒体类别都有一个APPChildViewController
。它们只是实例化数组的方式不同,数组的内容就这么说了。
我在另一个UIViewController(APPChildViewController
)中实例化所有[[APPChildViewController alloc] init]
类,然后最初选择一个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方法实现复制到所有子类时,它实际上有效,但这显然不是继承的工作方式......
答案 0 :(得分:0)
当你进行切换时,一些单元格会引用旧孩子的媒体,如果那个对象消失了哦哦:
NSDictionary *rowData = [self.media objectAtIndex:row];
尽快转换dataSource,你发送的是:
[self.tableView reloadData];
我假设(希望!)你只有父母拥有的一个笔尖......