1

UITableView でさまざまなカテゴリ (mostViewed、starred など) のメディアをいくつか表示したいと考えています。APPParentViewControllerどの実装UITableViewDataSourceUITableViewDelegateプロトコルを作成しました。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 メソッドの実装をすべてのサブクラスにコピーすると実際に機能しますが、これは明らかに継承が機能する方法ではありません...

4

1 に答える 1

0

切り替えを行うと、一部のセルは古い子のメディアへの参照を持ち、そのオブジェクトがなくなった場合:

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

すぐに dataSource の切り替えを行います。送信しますか:

 [self.tableView reloadData];

親が所有するペン先は 1 つだけだと思います (期待しています!)。

于 2012-09-06T21:28:03.907 に答える