2012-04-09 16 views
0

iPhone用のデータを正しく表示していますが、iPadのデータを表示していないXcode Universal Storyboardプロジェクトがあります。以下のコードを使用してデータ配列を初期化しました。[DetailViewController setDataController:]を解決しようとしています:インスタンスに送信された認識できないセレクタ

iPhoneで正常に動作しているが、iPadの中のデータを表示しないと、エラーを取得します。

-[DetailViewController setDataController:]: unrecognized selector sent to instance

これは、コンパイラが文句を言っているAppDelegate.m

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 
    UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 


    MasterViewController *masterViewController = (MasterViewController *)[navigationController topViewController]; 
     DataController *controller = [[DataController alloc] init]; 
     masterViewController.dataController = controller; 



splitViewController.delegate = (id)navigationController.topViewController; 
} else { 
     // Create the data controller and pass it to the master view controller. 
     UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
     MasterViewController *masterViewController = (MasterViewController *)   [navigationController topViewController]; 
     DataController *controller = [[DataController alloc] init]; 
     masterViewController.dataController = controller; 
} 

ですここのDetailViewControllerはそのファイルです。

#import "DetailViewController.h" 
#import "Play.h" 

@interface DetailViewController() 
@property (strong, nonatomic) UIPopoverController *masterPopoverController; 
@end 

@implementation DetailViewController 
@synthesize masterPopoverController = _masterPopoverController; 
@synthesize play; 

#pragma mark - 
#pragma mark View lifecycle 


    - (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
// Scroll the table view to the top before it appears 
    [self.tableView reloadData]; 
    [self.tableView setContentOffset:CGPointZero animated:YES]; 
//self.part = play.part; 

    } 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} else { 
    return YES; 
} 
} 

#pragma mark - Split view 

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UITableViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController 
{ 
barButtonItem.title = NSLocalizedString(@"Trading Rules That Work", @"Trading Rules That Work"); 
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; 
self.masterPopoverController = popoverController; 
} 

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UITableViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
// Called when the view is shown again in the split view, invalidating the button and popover controller. 
[self.navigationItem setLeftBarButtonItem:nil animated:YES]; 
self.masterPopoverController = nil; 
} 


#pragma mark - 
#pragma mark Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
// There are 2 sections, for rule, and media, in that order. 
return 2; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

//The number of rows varies by section. 

NSInteger rows = 0; 
switch (section) { 
    case 0: 
     // For part and date there is just one row. 
     rows = 1; 
     break; 
    case 1: 
     // For the media section, there are as many rows as there are media. 
     rows = [play.media count]; 
     break; 
    default: 
     break; 
} 
return rows; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    cell.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.textLabel.font = [UIFont boldSystemFontOfSize:11]; 
    cell.textLabel.numberOfLines = 13; 

} 


NSString *cellText = nil; 

switch (indexPath.section) { 
    case 0: 
     cellText = play.part; 
     break; 
    case 1: 
     cellText = [play.media objectAtIndex:indexPath.row]; 
     break; 
    default: 
     break; 
} 

cell.textLabel.text = cellText; 
return cell; 
} 

#pragma mark - 
#pragma mark Section header titles 

/* 
    HIG note: In this case, since the content of each section is obvious, there's probably  no need to provide a title, but the code is useful for illustration. 
    */ 
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 

NSString *title = nil; 
switch (section) { 
    case 0: 
     title = NSLocalizedString(@"Video Description", @"Part section title"); 
     break; 
    case 1: 
     title = NSLocalizedString(@"Media", @"Main Media section title"); 
     break; 
    default: 
     break; 
} 
return title; 
} 

@end 

答えて

1

あなたはObjective-Cのコードで

object.property = value; 

を行うと、それがためのショートカットです:あなたはdataController性質を持っているように見えないので

[object setProperty:value]; 

、ありますsetDataControllerセレクタはありません。

だから、次のいずれか

  • は、セッターを作成し、手動でインスタンス変数に割り当てる実装でそれを合成する、または
  • あなたDetailViewControllerの.hの中dataControllerプロパティを宣言。
+0

ありがとう、これはエラーの修正方法です。 –

+0

答えを受け入れてください。 :) – brindy

0

あなたのiPadストーリーボードでは、ナビゲーションコントローラのrootViewControllerに適切なクラスが設定されていないため、このエラーが発生しています。アイデンティティ・インスペクタで、そのviewControllerのクラスがDataControllerに設定されていることを確認してください。おそらくiPhoneのバージョンストーリーボードにこれが正しく設定されていると思われます。そのため、iPhoneバージョンを実行しているときにエラーが発生しないのです。

+0

アイデンティティ・インスペクタでDataControllerを追加してもまだ動作しません。ストーリーボードのスクリーンショットで再投稿します。ご意見ありがとうございます。 –

関連する問題