我有一个从桌面视图开始的Nav控制器。每行都会推送到细节UIView。我想在Detail UIView上有一个下一个和上一个按钮,它可以显示下一个和上一个视图而无需返回到父UITableView。所有细节都保存在一个数组中。我如何提前在DetailViewController.m .Thanx中访问该数组及其当前索引。
答案 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总是知道显示详细信息的对象和上一个/下一个对象(如果有的话)。