Как ссылаться на detailViewController на iPad, который использует splitViewController - PullRequest
1 голос
/ 03 февраля 2012

Я настраиваю проект на XCode 4.3 и IOS 5, не используя раскадровки для iPhone и iPad, используя настройки Master / Detail по умолчанию из диалога создания нового проекта.

iPhone отлично работает. Я выбираю опцию в tableView, и экран detailViewController обновляется новой информацией, основанной на выборе.

Моя реализация didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
        Shapes *currentShape = [self.shapesArray objectAtIndex:indexPath.row];  
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {  
            if (!self.detailViewController) {  
                self.detailViewController = [[[GeoDetailViewController alloc] initWithNibName:@"GeoDetailViewController_iPhone" bundle:nil] autorelease];  
            }  
            [self.navigationController pushViewController:self.detailViewController animated:YES];  
            [self.detailViewController populateDisplay:currentShape];  
        } else {  
            [self.detailViewController populateDisplay:currentShape];  
        }  
}  

Однако, когда я запускаю на iPad, self.detailViewController не существует. поэтому дисплей не обновляется. Я все еще вижу это на экране iPad, я просто не могу ничего изменить на нем. Как мне ссылаться на это в коде, чтобы я мог вносить изменения в то, что отображается?

Ответы [ 3 ]

1 голос
/ 04 февраля 2012

Я был озадачен реализацией шаблонов представления Master / Detail.Я задал похожий вопрос:

Как обновить DetailView с помощью шаблона приложения MasterDetail

Вы можете использовать свойство detailItem (id - так вы можете передать ссылку), котороепо умолчанию устанавливается для класса DetailViewController.

1 голос
/ 08 декабря 2013

В шаблоне master / detail Apple использует следующий код в MasterViewController (т. Е. Слева):

- (void)viewDidLoad {
    [super viewDidLoad];
    self.detailViewController = (MYDetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
}

Со свойством MasterViewController, определенным как:

@property (strong, nonatomic) MYDetailViewController *detailViewController;
1 голос
/ 03 февраля 2012

Если у вас есть указатель на сам контроллер разделенного представления, вы можете сделать:

[(GeoDetailViewController *)[[(UINavigationController *)[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] populateDisplay:currentShape];

Чтобы получить указатель на разделенное представление, вам, вероятно, придется пройти через делегата приложения:

UISplitViewController *splitViewController = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] splitViewController];

(при условии, что вы используете шаблон контроллера разделения представления по умолчанию - YMMV в зависимости от того, как вы его реализовали)

Обратите внимание, что когда вы создаете разделенное представление, вы должны установить контроллер подробного представления на GeoDetailViewController - если это не так, и вы не можете по причинам, связанным с дизайном приложения, я могу отредактировать свой ответ обойти это.

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