gpt4 book ai didi

ios - 从 Controller 内的页面更改 PageViewController 中的页面?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:00:17 26 4
gpt4 key购买 nike

我有一个包含 3 个页面的 UIPageViewController。如何通过点击按钮切换到 UIPageViewController 中的页面? (每个页面都是我在 Storyboard中制作的单独的 UIViewController)。

我已经尝试了很多代码,但是当我在我的 Storyboard中制作我的 UIPageViewController 并且我这样设置它时,我总是遇到错误:

PageViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];

self.dataSource = self;
self.navigationController.navigationBarHidden = NO;

[self setViewControllers:@[[self.storyboard instantiateViewControllerWithIdentifier:@"Main"]]
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:nil];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[NavView2ViewController class]])
return nil;

return [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[NavViewController class]])
return nil;

return [self.storyboard instantiateViewControllerWithIdentifier:@"one"];
}

最佳答案

您可以通过几种不同的方式来执行此操作,具体取决于您希望如何构建应用的其余部分。

NSNotificationCenter

使用通知将允许您将 subview Controller 与父页面 View Controller 分离。它将足够灵活,允许在整个应用程序中添加其他代码来控制哪个页面可见。然而,一个缺点是存在一定程度的间接性,并且无法立即看出是什么触发了页面更改。

在您的 PageViewController 上设置观察者,例如:

- (void)viewDidLoad
{
[super viewDidLoad];

self.dataSource = self;
self.navigationController.navigationBarHidden = NO;

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleButtonTap:)
name:MyPageViewControllerButtonNotification
object:nil];

[self setViewControllers:@[[self.storyboard instantiateViewControllerWithIdentifier:@"Main"]]
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:nil];
}

- (void)handleButtonTap:(NSNotification *)notification
{
// Determine which page to move to based
// on the notification object or userInfo
}

并发布来自任何 subview Controller 的通知:

- (void)buttonTapped:(id)sender
{
// Customise the sender or userInfo in order to
// pass further information with the notification.
[[NSNotificationCenter defaultCenter] postNotificationName:MyPageViewControllerButtonNotification
object:sender
userInfo:nil];
}

您需要在您的 PageViewController 和您希望从中发布此通知的所有 View Controller 通用的文件中创建字符串 MyPageViewControllerButtonNotification

Delegates

使用委托(delegate)模式将在 View Controller 和页面 View Controller 之间提供比通知更紧密的耦合,这可能会使以后更难以扩展。这样做的好处是很容易跟踪页面更改的来源。

在页面 View Controller 和 subview Controller 通用的文件中定义一个协议(protocol):

@protocol PageControlDelegate <NSObject>

- (void)moveToPage:(NSUInteger)pageNumber;

@end

确保您的页面 View Controller 符合该协议(protocol):

@interface PageViewController : UIPageViewController <PageControlDelegate>

(并实现PageViewController.m中的方法)

- (void)moveToPage:(NSUInteger)pageNumber
{
// switch to the appropriate page
}

当您为需要按钮交互的页面创建 View Controller 时,您需要提供对您的 PageViewController 的()引用:

@interface SomeChildViewController : UIViewController

@property (nonatomic, weak) id<PageControlDelegate> pageControlDelegate;

@end

以及设置下一页时的示例分配:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[NavViewController class]])
return nil;

SomeChildViewController *childController = [self.storyboard instantiateViewControllerWithIdentifier:@"one"];

childController.pageControlDelegate = self;

return childController;
}

然后您可以从任何具有 pageControlDelegate 的 subview Controller 直接调用此方法:

- (void)buttonTapped:(id)sender
{
NSUInteger pageNumber = // Decide which page to move to
[self.pageControlDelegate moveToPage:pageNumber];
}

关于ios - 从 Controller 内的页面更改 PageViewController 中的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com