0

我有一个 Xcode Universal Storyboard 项目,它可以正确显示 iPhone 的数据,但不显示 iPad 的数据。我已经使用下面的代码初始化了数据数组。

它在 iPhone 中正常工作,但在 iPad 中不显示数据并出现错误:

-[DetailViewController setDataController:]:无法识别的选择器发送到实例

这是 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
4

2 回答 2

1

当你这样做

object.property = value;

在 Objective-C 代码中,这是一个捷径:

[object setProperty:value];

由于您似乎没有 dataController 属性,因此没有 setDataController 选择器。

所以要么:

  • 在 DetailViewController 的 .h 中声明一个 dataController 属性,然后在您的实现中合成它,或者
  • 创建一个 setter 并手动将其分配给实例变量。
于 2012-04-09T22:26:41.447 回答
0

您收到此错误是因为在您的 iPad 故事板中,您没有为导航控制器的 rootViewController 正确设置类。确保该 viewController 的类DataController在 Identity Inspector 中设置为。您可能在 iPhone 版本的故事板中正确设置了此设置,这就是为什么您在运行 iPhone 版本时不会收到错误消息。

于 2012-04-09T22:28:02.737 回答