【问题标题】:Show Next and previous Detail UIView without going back to parent UITableView在不返回父 UITableView 的情况下显示下一个和上一个详细 UIView
【发布时间】:2011-02-09 03:45:18
【问题描述】:

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

【问题讨论】:

标签: objective-c


【解决方案1】:

另一种简洁(优雅)的方式是在表视图数据源(通常是包含表的 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 操作表格视图对象,当然风险自负!)

【讨论】:

  • 我很抱歉 viggio24。我不明白整个代码。我是 Objective-C 和 iPhone 开发的新手。我没有任何文件 DetailViewDataDelegate。你能解释一下那个委托文件吗?谢谢
  • 当然你必须定义委托协议。因此,您必须将 DetailViewDataDelegate 编写为协议:@protocol DetailViewDataDelegate 并定义(仅定义,而不是编码)两个委托函数。代码将编写在控制器中,该控制器将自己声明为 DetailViewDataDelegate 协议实现者。这里没有足够的空间来编写此代码,但我建议您仔细阅读有关该主题的精彩 Apple 文档(您可以在 Apple 的 Objective-C 编程指南中找到非常好的解释)。我推荐这种阅读方式,因为委托模式是可可的基础。
【解决方案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 始终知道它正在显示的详细信息以及上一个/下一个对象(如果有的话)。

【讨论】:

  • 它仅适用于显示下一页。当我再次单击下一页按钮时,我看到空白页。我确实登录了显示的ObjectIndex 值。并且似乎displayedObjectIndex 再次具有与单击下一个按钮之前相同的值。
  • 我在下一个函数中的代码如下所示: - (IBAction)nextPage:(id)sender {displayedObjectIndex++; DetailViewController *nextController = [[DetailViewController alloc] init]; NSString *storyyTitle = [[allObjects objectAtIndex:displayedObjectIndex] objectForKey:@"title"]; nextController.title = @"FindersFee"; nextController.sTitle = 故事标题; [self.navigationController pushViewController:nextController Animation:YES]; [下一个控制器发布]; }
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多