В моем примере я использую 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
Следующая вещь, чтобы добавить UISwipeGestureRecognizers в 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;
}
И вот все, что вам нужно в Detail View. Теперь перейдите в 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. Нет никакой проверки, есть ли какая-либо строка в секции, поэтому вам нужно это понять самостоятельно. Но весь шаблон делегации должен быть одинаковым.
Удачи вам!
Не могли бы вы помочь мне в этом вопросе: [link] (http://stackoverflow.com/questions/11513706/access-uitableview-cell-and-swipe-between-them-from-detailview-using-xcode-4) Я новичок и нуждаюсь в помощи по этому вопросу. – ingenspor