2012-02-20 2 views
4

Итак, у меня есть UITableView, разделенный на 3 раздела. Я хочу иметь возможность, как только я открою вторую строку в первом разделе (т. Е.), Проведите по экрану влево, чтобы перейти к следующей ячейке, и проведите по экрану вправо, чтобы перейти в предыдущую ячейку.Как перейти к следующей ячейке (Детальный просмотр) в UITableView?

Я написал код для прикосновения:

SecondDetailView.m 

- (void)viewDidLoad 
{ 
    UISwipeGestureRecognizer *swipeRecognizerLeft = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeDetectedLeft:)]; 
    swipeRecognizerLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [self.view addGestureRecognizer:swipeRecognizerLeft]; 
    [swipeRecognizerLeft release]; 

    UISwipeGestureRecognizer *swipeRecognizerRight = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeDetectedRight:)]; 
    swipeRecognizerRight.direction = UISwipeGestureRecognizerDirectionRight; 
    [self.view addGestureRecognizer:swipeRecognizerRight]; 
    [swipeRecognizerRight release]; 
} 


- (void)swipeDetectedRight:(UIGestureRecognizer *)sender { 

    NSLog(@"Right Swipe"); 

} 

- (void)swipeDetectedLeft:(UIGestureRecognizer *)sender { 
    NSLog(@"Left Swipe"); 
} 

Как я могу сделать это? Правильно ли вставить код в подробный вид?

ответ

3

У меня есть очень простое решение для вашей проблемы. Вам нужно объявить NSMutableArray *arr; в вашем .h файле и назначить ваш массив этому массиву, когда вы переходите на страницу подробностей. А также вам нужно объявить переменную NSString *currentPos;.

- (void)swipeDetectedRight:(UIGestureRecognizer *)sender { 

    currentPos--; 
    NSMutableDictionary *dic=[arr objectAtIndex:currentPos]; 


} 

- (void)swipeDetectedLeft:(UIGestureRecognizer *)sender { 
    currentPos++; 
    NSMutableDictionary *dic=[arr objectAtIndex:currentPos]; 
} 

Таким образом, вы можете получить свои следующие и предыдущие значения индекса массива.

Надеюсь, что эта помощь для вас. Shivam

+0

Не могли бы вы помочь мне в этом вопросе: [link] (http://stackoverflow.com/questions/11513706/access-uitableview-cell-and-swipe-between-them-from-detailview-using-xcode-4) Я новичок и нуждаюсь в помощи по этому вопросу. – ingenspor

0

Объявите протокол в контроллере подробного представления и установите родительский элемент (который должен быть контроллером представления таблиц) в качестве делегата. Затем в методах салфетки вызовите делегата и выполните необходимый код для изменения выбранной строки.

1

В моем примере я использую 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. Нет никакой проверки, есть ли какая-либо строка в секции, поэтому вам нужно это понять самостоятельно. Но весь шаблон делегации должен быть одинаковым.

Удачи вам!

+0

Большое спасибо за ваш ответ! Но когда у меня больше, чем просто DetailViewController, я должен вставлять каждый раз, когда делегат в моем TableViewController для каждого DetailView? – Phillip

+0

Я не уверен, что вы имеете в виду. В моем коде есть только один экземпляр DetailViewController, и я повторно использую этот экземпляр для отображения разных данных для каждой ячейки. Вы устанавливаете делегирование только один раз - при создании detailViewController. Это то, что вы имели в виду? – nagan

+0

Да. В меньших словах у меня есть 70 detailViewControllers (разделены на разделы, каждый detailViewController имеет другое имя, например firstViewController, appleViewController, nutViewController, но это всего лишь деталь). Мне нужно вставить делегата в tableViewController для каждого из 70 detailViewControllers, которые у меня есть или? Соз, я новичок в этом! – Phillip

Смежные вопросы