在我的示例中,我使用 NSString 作为将显示在详细视图控制器中的数据。随意将其更改为适合您需要的任何内容。好的,我们开始吧:
首先在 DetailViewController 中声明一个协议,如下所示:
@class DetailViewController;
@protocol DetailViewControllerDelegate <NSObject>
- (void)swipeToNextCell:(DetailViewController *)sender;
- (void)swipeToPreviousCell:(DetailViewController *)sender;
@end
@interface DetailViewController : UIViewController
@property(weak, nonatomic) id<DetailViewControllerDelegate> delegate;
@property(copy, nonatomic) NSString *data;
@property(weak, nonatomic) IBOutlet UILabel *label;
@end
接下来就是在DetailViewController中添加UISwipeGestureRecognizers来检查手势:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UISwipeGestureRecognizer *leftGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDetectedLeft:)];
leftGesture.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:leftGesture];
UISwipeGestureRecognizer *rightGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDetectedRight:)];
rightGesture.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:rightGesture];
}
实现 viewWillAppear 以在您推送 DetailViewController 时显示您的数据:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.label.text = self.data;
}
不要忘记实现将被 GestureRecognizers 调用的方法:
- (void)swipeDetectedRight:(UISwipeGestureRecognizer *)sender
{
NSLog(@"Right Swipe");
[self.delegate swipeToNextCell:self];
self.label.text = self.data;
}
- (void)swipeDetectedLeft:(UISwipeGestureRecognizer *)sender
{
NSLog(@"Left Swipe");
[self.delegate swipeToPreviousCell:self];
self.label.text = self.data;
}
这就是您在详细视图中所需要的一切。现在转到 TableViewController。您的 TableViewController 应该实现 DetailViewControllerDelegate 协议:
@interface CustomTableViewController : UITableViewController <DetailViewControllerDelegate>
@property(strong, nonatomic) DetailViewController *detailViewController;
@property(assign, nonatomic) NSInteger currentRow;
@end
这是我的 detailViewController @property 的 getter:
- (DetailViewController *)detailViewController
{
if (_detailViewController == nil)
{
_detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
_detailViewController.delegate = self;
}
return _detailViewController;
}
这是我管理行选择的方式:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *viewController = self.detailViewController;
viewController.data = [NSString stringWithFormat:@"Cell: %d", indexPath.row];
viewController.title = @"Detail";
self.currentRow = indexPath.row;
[self.navigationController pushViewController:viewController animated:YES];
}
你要做的最后一件事是实现协议的方法:
- (void)swipeToNextCell:(DetailViewController *)sender
{
// Get data for next row
sender.data = [NSString stringWithFormat:@"Cell: %d", ++self.currentRow];
}
- (void)swipeToPreviousCell:(DetailViewController *)sender
{
// Get data for next row
sender.data = [NSString stringWithFormat:@"Cell: %d", --self.currentRow];
}
我在模拟器上测试过,效果很好。这非常简单,因为我的数据模型非常简单——它只是 NSString。没有检查部分中是否有任何行,因此您必须自己弄清楚。但是整个委托模式应该是一样的。
祝你好运!