页面视图控制器更新视图控制器

时间:2015-05-20 08:57:42

标签: ios objective-c methods updating

我有一个页面视图控制器,每次用户滑动时,我都会使用此方法来检测转换是否已完成。

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed

现在,我在页面视图控制器中显示 5个视图控制器,并且每个视图控制器都有一个UILabel 。使用上面的方法来检测成功转换,我希望每次转换完成后,使用来自页面视图控制器类的数据更新UILabels。

因此,每次用户滑动时,我都希望使用页面视图控制器类中的新值更新5个视图控制器上的UILabel。

最好的方法是什么,(定期更新不同类的字符串/调用方法)?我环顾四周,找不到任何相关的东西?!非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:0)

你可以用两种方式来做,

  1. 如果您以编程方式创建UILabel以使所有子视图控制器都从具有UILabel的视图控制器继承,那么代码将是这样的

    @interface ViewControllerWithLabel : UIViewController 
    
    @property (strong, nonatomic) UILabel *someLabel;
    
    @end
    

    然后页面中的所有控制器都将继承此类

    @interface ViewControllerPage1: ViewControllerWithLabel
    

    ...

    @interface ViewControllerPage2: ViewControllerWithLabel
    

    ...

    @interface ViewControllerPage3: ViewControllerWithLabel
    

    ...

    @interface ViewControllerPage4: ViewControllerWithLabel
    

    ...

    @interface ViewControllerPage5: ViewControllerWithLabel
    
  2. 并在你的

        - (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
        {
            for(ViewControllerWithLabel *changeView in pageViewController.viewControllers)
            {
                 changeView.someLabel = @"Some Text";
            }
         }
    
    1. 第二种方式如果您使用的是Storyboard和IBOutlet,则必须检查每种类型的ViewController并设置标签如下

       - (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
      {
          for(UIViewController *changeView in pageViewController.viewControllers)
          {
              if ([changeView isKindOfClass:[ViewControllerPage1 class]]
              {
                    ViewControllerPage1* temp = (ViewControllerPage1*)changeView;
                   temp.labelName.text = @"Some Text";
              }
              else if ([changeView isKindOfClass:[ViewControllerPage2 class]]
              {
                    ViewControllerPage2* temp = (ViewControllerPage2*)changeView;
                   temp.labelName.text = @"Some Text";
              }   
              else if ([changeView isKindOfClass:[ViewControllerPage3 class]]
              {
                    ViewControllerPage3* temp = (ViewControllerPage3*)changeView;
                   temp.labelName.text = @"Some Text";
              }
              else if ([changeView isKindOfClass:[ViewControllerPage4 class]]
              {
                    ViewControllerPage4* temp = (ViewControllerPage4*)changeView;
                   temp.labelName.text = @"Some Text";
              }
              else if ([changeView isKindOfClass:[ViewControllerPage5 class]]
              {
                    ViewControllerPage5* temp = (ViewControllerPage5*)changeView;
                   temp.labelName.text = @"Some Text";
              }
          }
       }
      

答案 1 :(得分:0)

  

因此,每次用户滑动时,我都希望使用页面视图控制器类中的新值更新5个视图控制器上的UILabel。

你不能,因为“5视图控制器”不存在的简单原因。这不是UIPageViewController的工作方式。它一次只有一个子视图控制器 - 当前页面。

因此,当用户滚动到该视图控制器时,您可以更新特定视图控制器的标签(页面)。此时,您必须重新创建并提供视图控制器,并且可以使用适当的标签值对其进行配置。否则,您只需坐在那里,存储标签所拥有的值,直到那一刻到来。

答案 2 :(得分:0)

我发现做这些人的最好方法是通过NSNotifications。我在我想要更新的每个视图控制器类中创建一个观察者,然后我只是在主类中调用Notifications,然后视图控制器调用它们内部的方法!这么简单干净!

在要更新的课程中添加此内容:

 [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(updateLabel:)
                                                 name:@"LABELUPDATENOTIFICATION1"
                                               object:nil];

为它创建一个方法:

- (void)updateLabel:(NSNotification*)notification
{
    NSString *updatedText = (NSString*)[notification object];
    [nameLabel setText:updatedText];
}

然后从任何其他类调用它,并调用您创建的方法:

[[NSNotificationCenter defaultCenter] postNotificationName:@"LABELUPDATENOTIFICATION1"object:content1];

我很惊讶没有人从一开始就向我提出这个问题,因为这很简单,所有其他答案似乎都很复杂。