[英]Page View Controller update view controllers ?
我有一個頁面視圖控制器,每次用戶滑動時,我都會使用此方法來檢測轉換是否完成。
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
現在,我有5個視圖控制器顯示在頁面視圖控制器中,並且每個視圖控制器上都有一個UILabel 。 使用以上方法檢測成功的過渡,我想在每次過渡完成時使用頁面視圖控制器類中的數據更新UILabel。
因此,每次用戶滑動時,我都希望使用頁面視圖控制器類中的新值來更新5個視圖控制器上的UILabel。
做到這一點的最佳方法是什么(定期更新其他類的字符串/調用方法)? 我環顧四周,找不到任何相關信息?! 任何幫助將不勝感激,謝謝。
您可以通過兩種方式做到這一點,
如果要以編程方式創建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";
}
}
第二種方法,如果您使用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.