#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:
. Чтобы отобразить содержимое массива в aUILabel
, вам нужно просто установитьtext
свойство на метке внутри-pageChanged:
метода.4. Почему вы создаете новый элемент управления страницей с именем aPageControl? Кроме того, мой код состоит из объектов, использующих ключи. Будет ли работать этот код: ` NSString *SelectedItem = [[self.records objectAtIndex:aPageControl.currentPage] valueForKey:@»name»]; ` Наконец, pageChanged вызывается при пролистывании экрана?
5. Нет необходимости создавать
aPagedControl
переменную, это просто демонстрация того, чтоsender
есть. Нет,UIPageControl
это чисто визуально. Чтобы иметьpageChanged:
при прокрутке экрана, вам нужно использовать aUISwipeGestureRecognizer
и прикрепить его к просмотру, который вы просматриваете, и установить то жеtarget
самое иaction
на нем. Да, ifself.records
— это массив объектов иname
NSString *
свойство для этих объектов,selectedItem
должно содержать свойство name .