UITableView でさまざまなカテゴリ (mostViewed、starred など) のメディアをいくつか表示したいと考えています。APPParentViewController
どの実装UITableViewDataSource
とUITableViewDelegate
プロトコルを作成しました。cellForRowAtIndexPath
メソッド inではAPPParentViewController
、配列からのデータで満たされた適切なセルを返します。
配列は、実際にはinit
のサブクラスのメソッドでインスタンス化されます。APPParentViewController
これを例として と呼びAPPChildViewController
ます。APPChildViewController
メディア カテゴリごとに 1 つあります。それらは、配列がインスタンス化される方法、つまり配列の内容が異なるだけです。
すべてのAPPChildViewController
クラスを別の UIViewController ( [[APPChildViewController alloc] init]
) でインスタンス化し、最初に 1 つ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 メソッドの実装をすべてのサブクラスにコピーすると実際に機能しますが、これは明らかに継承が機能する方法ではありません...