Показать следующую и предыдущую деталь UIView, не возвращаясь к родительскому UITableView - PullRequest
2 голосов
/ 08 февраля 2011

У меня есть контроллер Nav, который начинается с табличного представления.Каждый ряд подталкивает к детализации UIView.Я хотел бы иметь следующую и предыдущую кнопки в Detail UIView, которые бы отображали следующий и предыдущий виды без возврата к родительскому UITableView.Все детали сохраняются в массиве.Как я могу получить доступ к этому массиву и его текущий индекс в DetailViewController.m .Thanx заранее.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

Другой простой (и элегантный) способ - это создать некую связь между источником данных табличного представления, которым обычно является UIViewController, который содержит таблицу, и подробным представлением: это можно сделать с помощью шаблона Delegate, типичного для Cocoa.фреймворк.В этом случае вы можете определить протокол DetailViewDataDelegate только двумя методами:

-(id)nextTableObjectFrom:(id)referenceObject; -(id)prevTableObject;(id)referenceObject;

, где referenceObject - это вызывающий объект, то есть объект, подробно описанный в DetailView.Поэтому DetailView будет определен следующим образом:


@interface DetailViewController:UIViewController {
}
@property (nonatomic,assign) id currentDetailedObject;
@property (nonatomic,assign) id dataDelegate;

и, конечно, когда вы вызываете контроллер, типичный для tableView: didSelectElementWithIndexPath: animated: метод, вы будете делать что-то вроде этого:


DetailViewController *dv = [[[DetailViewController alloc] initWithNibName:nil bundle:nil] autorelease];
dv.dataDelegate=self;
dv.currentDetailedObject=[mySourceArray objectAtIndexPath:indexPath.row];
[self.navigationController pushViewController:dv animated:YES];

Наконец, в DetailViewController, когда вам понадобится следующий (или предыдущий) элемент из таблицы, вы просто вызовете: -(IBAction)nextButtonPressed { self.currentDetailedObject = [self.dataDelegate nextTableObjectFrom:self.currentDetailedObject]; }

Конечно, детали реализации могут измениться, и, в частности, методы делегата,быть реализованным в UIViewController таблицы, будет зависеть от структуры данных.Преимущество такого подхода, который может быть на первый взгляд сложным, довольно элегантен и позволяет избежать передачи объектов вдоль контроллеров, что часто является источником проблем с памятью.Кроме того, с помощью делегированного подхода вы можете реализовать любую сложную функцию (например, вы даже можете управлять объектами табличного представления непосредственно из DetailViewController, конечно, на свой страх и риск!)

2 голосов
/ 08 февраля 2011

Самый простой способ - создать пользовательский инициализатор для DetailViewController:

@interface DetailViewController : UIViewController
{
    NSArray* allObjects;
    NSUInteger displayedObjectIndex;
}

- (id) initWithObjectAtIndex: (NSUInteger) index inArray: (NSArray *) objects;

@end


@implementation DetailViewController

- (id) initWithObjectAtIndex: (NSUInteger) index inArray: (NSArray *) objects
{
    self = [super initWithNibName:nil bundle:nil];
    if ( self ) {
        allObjects = [objects copy];
        displayedObjectIndex = index;
    }
    return self;
}

@end

Таким образом, DetailViewController всегда знает как для какого объекта он отображает детали, так и для предыдущих / следующих объектов, если таковые имеются.

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