Доступ к UITableView, когда мешает UINavigationController (в UISplitViewController) - PullRequest
1 голос
/ 08 марта 2012

У меня есть UISplitViewController, который настроен так:

-(IBAction)makeStory:(id)sender{
NSLog(@"makeStory:");

    makeStoryTableViewController = [[MakeStoryTableViewController alloc] initWithNibName:@"MakeStoryTableViewController" bundle:nil];
    MakeSentenceTableViewController *detailViewController = [[MakeSentenceTableViewController alloc] initWithNibName:@"MakeSentenceTableViewController" bundle:nil];
    UISplitViewController *splitViewController = [[[UISplitViewController alloc] init] autorelease];

    UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:makeStoryTableViewController]autorelease];

    UINavigationController *detailNav = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil];
    splitViewController.delegate        = makeStoryTableViewController;

    StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate.window setRootViewController:splitViewController];
}

Когда я пытаюсь установить detailView в делегате UISplitView в результате didSelectRowAtIndexPath :, я могу получить доступ только к NavigationController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {   
    NSLog(@"ViewControllers: %@", [self.splitViewController viewControllers]);
    MakeSentenceTableViewController *detailViewController = [[self.splitViewController viewControllers] objectAtIndex:1];
    Story *storySet = [fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"detailViewController: %@", detailViewController); //Logs a UINavigationController
    [detailViewController setStory:storySet]; //Fails here because Navigation Controllers Can't setStory!
    [detailViewController refreshTables];
} 

Что имеет смысл, но как мне получить доступ к TableViews, за который отвечают UINavigationControllers? Если я удаляю * rootNav и * detailNav и заменяю их UITableViews в операторе splitViewController.viewControllers, это работает нормально, но тогда у меня нет навигационной панели:

    MakeSentenceTableViewController *detailViewController = [[MakeSentenceTableViewController alloc] initWithNibName:@"MakeSentenceTableViewController" bundle:nil];
    UISplitViewController *splitViewController = [[[UISplitViewController alloc] init] autorelease];

    //UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:makeStoryTableViewController]autorelease];

    //UINavigationController *detailNav = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];

    splitViewController.viewControllers = [NSArray arrayWithObjects:makeStoryTableViewController, detailViewController, nil];
    splitViewController.delegate        = makeStoryTableViewController;

    StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate.window setRootViewController:splitViewController];

Как получить доступ к контроллеру Detail TableView и сохранить панель навигации?

1 Ответ

0 голосов
/ 09 марта 2012

Вот как я это понял. Я сделал две ошибки, и в этих ошибках мне пришлось использовать свойство UINavigationController.viewControllers ObjectAtIndex: .

  1. В функции makeStory я неправильно назначал UINavigationController в качестве делегата вместо makeStoryTableViewController. Вместо этого я исправил это (обратите особое внимание на раздел splitViewController.delegate):

    MakeSentenceTableViewController *detailViewController = [[MakeSentenceTableViewController alloc] initWithNibName:@"MakeSentenceTableViewController" bundle:nil]; 
    UISplitViewController *splitViewController = [[[UISplitViewController alloc] init] autorelease];
    
    UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:makeStoryTableViewController]autorelease];
    
    UINavigationController *detailNav = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];
    
    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil];
    
    //splitViewController.viewControllers = [NSArray arrayWithObjects:makeStoryTableViewController, detailViewController, nil];
    //RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
    
    splitViewController.delegate        = [rootNav.viewControllers objectAtIndex:0];
    
    NSLog(@"delegate: %@",  [rootNav.viewControllers objectAtIndex:0]);
    
    StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"RootViewController: %@", appDelegate.window);
    
    [appDelegate.window setRootViewController:splitViewController];
    
    NSLog(@"AppDelegate.window: %@", appDelegate.window.rootViewController);
    
  2. Я сделал ту же ошибку снова, на этот раз в didSelectRowAtIndexPath: и попытался установить Story в UINavigationController. Чтобы это исправить, я сделал это (обратите особое внимание на бит о navControllerDetail.viewControllers:

    UINavigationController *navControllerDetail;
    navControllerDetail = [[self.splitViewController viewControllers] objectAtIndex:1];
    
    
    
    MakeSentenceTableViewController *detailViewController;
    
    detailViewController = [navControllerDetail.viewControllers objectAtIndex:0];
    
    Story *storySet = [fetchedResultsController objectAtIndexPath:indexPath];
    
    
    
    NSLog(@"detailViewController: %@", detailViewController);
    [detailViewController setStory:storySet];
    [detailViewController refreshTables];
    

Теперь, если бы я только мог понять, как заставить SplitViewController вращаться правильно !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...