在其中一个控制器中按下按钮时更改页面视图控制器中的视图

Posted

技术标签:

【中文标题】在其中一个控制器中按下按钮时更改页面视图控制器中的视图【英文标题】:Change view in a page view controller when button is pressed in one of the controllers 【发布时间】:2015-08-30 18:37:40 【问题描述】:

我有一个UIPageViewController 连接到三个视图控制器

每个UIViewController 三个类

当按下“拍照”按钮时,第三个视图应该会滑入视图。当“从库中选择”被推送时,第一个视图控制器应该滑入视图。

我有 3 个类控制每个 UIViewController,还有一个类控制情节提要中的页面。这是 pageViewController.m

@implementation pageViewController


NSArray *myViewControllers;


- (void)viewDidLoad 
  [super viewDidLoad];    

  self.delegate = self;
  self.dataSource = self;

  UIViewController *p1 = [self.storyboard instantiateViewControllerWithIdentifier:@"one"];
  UIViewController *p2 = [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
  UIViewController *p3 = [self.storyboard instantiateViewControllerWithIdentifier:@"three"];


  myViewControllers = @[p1, p2, p3];
  pageTwoViewController *ptvc = [[pageTwoViewController alloc] init];
  ptvc.publicViewControllers = myViewControllers;

  [self setViewControllers:@[p2] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

该应用已被编程为在向左或向右滑动时切换视图。

我将按钮链接到它们的相关类,但我不知道如何通过按钮切换可见视图控制器。在第二个视图控制器上按下其中一个按钮时,如何更改可见的 UIViewController

【问题讨论】:

【参考方案1】:

再次调用“setViewControllers”以切换到不同的视图控制器。因此,例如,如果您想移动到“p1”,请使用以下内容:

// grab a reference out of your existing NSArray
UIViewController *newVC = self.myViewControllers[0];
[self setViewControllers:@[newVC] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];

使用“animated:YES”会产生与用户手动导航相同的幻灯片。根据你是向前跳还是向后跳来调整“方向”。

要在您的子视图控制器和它们的父视图控制器之间进行通信,请使用委托。首先,在父视图控制器的标头中声明一个委托,例如:

@protocol PhotoSourceDelegate <NSObject>
  - (void)takePhoto;
  - (void)chooseFromLibrary;
@end

更新你的父视图控制器来实现这个委托:

@interface pageViewController : UIPageViewController <PhotoSourceDelegate>
@end

@implementation pageViewController
...
#pragma mark - PhotoSourceDelegate
- (void)takePhoto 
  // call "setViewController" to display "take photo" view controller;


- (void)chooseFromLibrary 
  // call "setViewController" to display "choose from library" view controller;

在显示“拍照”和“从库中选择”按钮(p2?)的视图控制器的标题中,添加一个属性来保存对委托的引用:

@property(nonatomic, weak) id<PhotoSourceDelegate> delegate;

当你实例化这个控制器时,一定要设置它的委托:

UIViewController *p2 = [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
p2.delegate = self;

最后,在同一个视图控制器中,当您按下“拍照”按钮时,像这样调用代理:

if (self.delegate != nil) 
  [self.delegate takePhoto];

当你按下“从库中选择”按钮时,像这样调用代理:

if (self.delegate != nil) 
  [self.delegate chooseFromLibrary];

委托的使用在 ios 中非常普遍,因此如果/当您准备好获得更好的理解时,快速搜索会找到相当多的教程。

【讨论】:

我的视图数组位于父视图控制器中,与拥有我想要更改视图的按钮的视图控制器 (p2) 分开。我需要 p2 才能访问父视图控制器的视图控制器数组,以便可以更改视图。我怎么能这样做? 然后使用委托从您的 p1/p2/p3 视图控制器与您的父视图控制器进行通信,父视图控制器进而导航到适当的视图。 这是我几个小时以来一直在尝试做的事情,哈。你介意解释一下我是怎么做这个代表的吗? 使用委托在视图控制器之间进行通信的信息更新答案。 谢谢,这真的很有帮助,但我在设置 p2 的代表时遇到了一个问题。我试图在它最初在父视图控制器中实例化时设置它,但它返回一个错误。我应该在其他地方设置它的委托吗?

以上是关于在其中一个控制器中按下按钮时更改页面视图控制器中的视图的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIPageControl 在按钮按下时发送数据和更改页面

如何检测在导航控制器的下一个视图控制器中按下后退按钮

在导航栏中按下后退按钮时刷新 RootViewController 的内容

如何通过在自定义视图中按下按钮从超级视图中删除自定义视图?

在 _Layout 文件中按下按钮时,如何在 Razor 页面中创建 cookie?

按下后退按钮后,从另一个视图控制器更改按钮