显示下一个和上一个详细信息UIView而不返回到父UITableView

时间:2011-02-08 19:12:12

标签: objective-c

我有一个从桌面视图开始的Nav控制器。每行都会推送到细节UIView。我想在Detail UIView上有一个下一个和上一个按钮,它可以显示下一个和上一个视图而无需返回到父UITableView。所有细节都保存在一个数组中。我如何提前在DetailViewController.m .Thanx中访问该数组及其当前索引。

2 个答案:

答案 0 :(得分:3)

另一种干净(优雅)的方法是在表视图数据源(通常是包含表的UIViewController)和详细视图之间构建某种连接:这可以使用委托模式来完成,这是典型的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操作表视图对象,当然风险自负!)

答案 1 :(得分:2)

最简洁的方法是为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总是知道显示详细信息的对象和上一个/下一个对象(如果有的话)。