В моем примере я использую 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
Следующим шагом является добавление UISwipeGestureRecognizer в DetailViewController для проверки на жесты:
- (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:
- (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. Там нет проверки, есть ли какая-либо строка в разделе, поэтому вы должны выяснить это самостоятельно. Но весь шаблон делегирования должен быть одинаковым.
Удачи!