Управление страницей через массив

#iphone #objective-c #ios #xcode #uipagecontrol

#iPhone #objective-c #iOS #xcode #UIPageControl

Вопрос:

Я заинтересован в использовании элемента управления страницей для переключения между записями в моем массиве без изменения представления. Как я могу это сделать? Есть ли учебник . . .

Однако всякий раз, когда страницы переключаются, цвет фона и некоторые изображения меняются. Есть ли какой-нибудь способ запустить код после переключения страницы?

Спасибо

Ответ №1:

UIPageControl представляет только подкачку, оно не управляет самим поведением подкачки. Вам нужно будет написать свой собственный код для перебора вашего массива при нажатии на UIPageControl . currentPage Свойство должно быть установлено на индекс, с которым вы работаете в своем массиве, totalPages свойство должно быть установлено на свойство массива count . Наконец, вам нужно настроить пару цель / действие для UIControlEventValueChanged события с помощью -addTarget:action:forControlEvents:

 [pageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged];
  

В документации говорится:

Когда пользователь нажимает на элемент управления страницей для перехода на следующую или предыдущую страницу, элемент управления отправляет событие UIControlEventValueChanged для обработки делегатом. Затем делегат может оценить свойство currentPage, чтобы определить страницу для отображения. Управление страницей продвигает только одну страницу в любом направлении.

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

Пример:

 @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property (strong, nonatomic) NSArray *items;
  

[…]

 - (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.items = [NSArray arrayWithObjects:@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine",@"Ten", nil];
    [self.pageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged];

    // Left Swipe to go to previous page
    UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(previousPage:)];
    leftSwipeGestureRecognizer.direction = numberOfTouchesRequired = 1;
    leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.view addGestureRecognizer:leftSwipeGestureRecognizer];

    // Right Swipe to go to next page
    UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(nextPage:)];
    rightSwipeGestureRecognizer.direction = numberOfTouchesRequired = 1;
    rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:rightSwipeGestureRecognizer];

}

- (void)previousPage:(UISwipeGestureRecognizer *)swipeGestureRecognizer
{
    self.pageControl.currentPage = self.pageControl.currentPage-1;
}

- (void)nextPage:(UISwipeGestureRecognizer *)swipeGestureRecognizer
{
    self.pageControl.currentPage = self.pageControl.currentPage 1;
}

- (void)pageChanged:(id)sender
{
    NSString *selectedItem = [self.items objectAtIndex:self.pageControl.currentPage];
    NSLog(@"nSelected Item: %@nCurrent Page: %dnTotal Number of Pages: %dn", selectedItem, self.pageControl.currentPage 1, self.pageControl.numberOfPages);
}
  

Когда вы нажимаете на элемент управления страницей, он перемещается вперед или назад по массиву строк, представленных self.items свойством. -pageChanged: здесь вы также должны обновить элементы управления в представлении.

Если вы хотите обновить текущую страницу в UIPageControl в другой области, просто выполните:

 self.pageControl.currentPage = 5;  // set to whatever page you need represented
  

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить еще несколько примеров кода, я впервые использую элемент управления страницей.

2. Хорошо, NSLog не отображается, и действительно ли ваш код изменит строку? Если да, нужно ли перезагружать код для отображения массива в ярлыке?

3. Если NSLog() оператор не вызывается, -pageChanged: метод не вызывается, что означает -addTarget:action:forControlEvents: , что он не устанавливается на вашем UIPageControl . Код не изменяет элементы в массиве, он считывает текущий элемент, который представляет currentPage свойство UIPageControl . Вам нужно убедиться, что -addTarget:action:forControlEvents: это вызывается в -viewDidLoad: or -viewWillAppear: . Чтобы отобразить содержимое массива в a UILabel , вам нужно просто установить text свойство на метке внутри -pageChanged: метода.

4. Почему вы создаете новый элемент управления страницей с именем aPageControl? Кроме того, мой код состоит из объектов, использующих ключи. Будет ли работать этот код: ` NSString *SelectedItem = [[self.records objectAtIndex:aPageControl.currentPage] valueForKey:@»name»]; ` Наконец, pageChanged вызывается при пролистывании экрана?

5. Нет необходимости создавать aPagedControl переменную, это просто демонстрация того, что sender есть. Нет, UIPageControl это чисто визуально. Чтобы иметь pageChanged: при прокрутке экрана, вам нужно использовать a UISwipeGestureRecognizer и прикрепить его к просмотру, который вы просматриваете, и установить то же target самое и action на нем. Да, if self.records — это массив объектов и name NSString * свойство для этих объектов, selectedItem должно содержать свойство name .