Допустим, у вас есть CatalogViewController
(который является подклассом UITableViewController
) и ProductViewController
(который является подклассом UIViewController
).
Самый простой способ реализовать «пролистывание до следующего продукта» - дать ProductViewController
ссылку на CatalogViewController
. Это должно быть weak
(если используется ARC) или assign
(если не используется ARC). Вам также понадобится свойство, которое содержит индекс товара в каталоге:
@interface ProductViewController
@property (nonatomic, weak) CatalogViewController *catalogViewController;
@property (nonatomic) NSInteger productIndex;
@end
Затем в методе действия для прокрутки вы отправляете сообщение для CatalogViewController
с просьбой перейти к следующему (или предыдущему) продукту в каталоге:
@implementation ProductViewController
- (IBAction)showNextProduct:(id)sender {
[self.catalogViewController goToProductAtIndex:self.productIndex + 1];
}
- (IBAction)showPriorProduct:(id)sender {
[self.catalogViewController goToProductAtIndex:self.productIndex - 1];
}
В CatalogViewController
всякий раз, когда вы создаете ProductViewController
, вам необходимо установить эти свойства:
@implementation CatalogViewController
- (ProductViewController *)productViewControllerForProductAtIndex:(NSInteger)index {
if (index < 0 || index >= self.products.count)
return nil;
ProductViewController *vc = [[ProductViewController alloc] initWithProduct:[self.products objectAtIndex:index]];
vc.catalogViewController = self;
vc.productIndex = index;
return vc;
}
и вы реализуете метод goToProductAtIndex:
следующим образом:
- (void)goToProductAtIndex:(NSInteger)index {
ProductViewController *vc = [self productViewControllerForProductAtIndex:index];
if (!vc)
return;
NSMutableArray *vcs = [[self.navigationController viewControllers] mutableCopy];
while (vcs.lastObject != self)
[vcs removeLastObject];
[vcs addObject:vc];
[self.navigationController setViewControllers:vcs animated:YES];
}
Вы можете использовать тот же метод для обработки выбора строки таблицы:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self goToProductAtIndex:indexPath.row];
}
Если вы хотите получить больше программных средств, вы можете создать протокол с использованием метода goToProductAtIndex:
и использовать его, чтобы не знать ProductViewController
о классе CatalogViewController
.