我有一个页面视图控制器,每次用户滑动时,我都会使用此方法来检测转换是否已完成。
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
现在,我在页面视图控制器中显示 5个视图控制器,并且每个视图控制器都有一个UILabel 。使用上面的方法来检测成功转换,我希望每次转换完成后,使用来自页面视图控制器类的数据更新UILabels。
因此,每次用户滑动时,我都希望使用页面视图控制器类中的新值更新5个视图控制器上的UILabel。
最好的方法是什么,(定期更新不同类的字符串/调用方法)?我环顾四周,找不到任何相关的东西?!非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
你可以用两种方式来做,
如果您以编程方式创建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";
}
}
}
答案 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];
我很惊讶没有人从一开始就向我提出这个问题,因为这很简单,所有其他答案似乎都很复杂。