Как перейти к следующей ячейке (подробный вид) в UITableView? - PullRequest
4 голосов
/ 20 февраля 2012

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

Я написал код для прокрутки:

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 ]

3 голосов
/ 02 марта 2012

У меня есть очень простое решение для вашей проблемы. Вам нужно объявить 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];
}

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

Надеюсь, это поможет вам. Шивам

1 голос
/ 28 февраля 2012

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

Удачи!

0 голосов
/ 20 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...