簡體   English   中英

頁面視圖控制器更新視圖控制器?

[英]Page View Controller update view controllers ?

我有一個頁面視圖控制器,每次用戶滑動時,我都會使用此方法來檢測轉換是否完成。

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

現在,我有5個視圖控制器顯示在頁面視圖控制器中,並且每個視圖控制器上都有一個UILabel 使用以上方法檢測成功的過渡,我想在每次過渡完成時使用頁面視圖控制器類中的數據更新UILabel。

因此,每次用戶滑動時,我都希望使用頁面視圖控制器類中的新值來更新5個視圖控制器上的UILabel。

做到這一點的最佳方法是什么(定期更新其他類的字符串/調用方法)? 我環顧四周,找不到任何相關信息?! 任何幫助將不勝感激,謝謝。

您可以通過兩種方式做到這一點,

  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 

在你的

    - (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"; } } } 

因此,每次用戶滑動時,我都希望使用頁面視圖控制器類中的新值來更新5個視圖控制器上的UILabel。

您不能這樣做,原因很簡單,即不存在“ 5個視圖控制器”。 這不是UIPageViewController的工作方式。 一次只有一個子視圖控制器-當前頁面。

因此, 當用戶滾動到該視圖控制器 (頁面) ,可以更新特定視圖控制器的標簽。 那時,您將不得不重新創建並提供視圖控制器,並且可以使用標簽的適當值對其進行配置。 否則,您只需要坐在那里,存儲標簽具有的值,直到那一刻到來。

我發現做到這一點的最好方法是通過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];

我很驚訝沒有人從一開始就建議我這樣做,因為這很簡單,所有其他答案似乎都那么復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM