0

我有一个带有主视图控制器的应用程序,它加载“第一页”视图控制器。一旦用户点击了几个按钮,我就会以这种方式将“第一页:视图控制器”换成第二页:

        [UIView transitionFromView:self.view toView:self.secondPageVC.view duration:1.0 options:UIViewAnimationOptionTransitionFlipFromRight completion:^(BOOL done ) {
            [self.view removeFromSuperview];
        }];

为了做到这一点,我包含了“下一页”的头文件,它将加载并在当前视图控制器的类中创建下一页的实例。

在我到达最后一页之前,所有这些都可以正常工作。其中一个按钮组合将用户返回到第一页。但是,当我尝试在最后一页中包含第一页的头文件时,出现错误。我认为正在发生的事情是,每个视图控制器类在其定义中都有一个下一页的实例,当我们到达最后一页时,添加第一页的实例会导致编译器不喜欢的循环。有人可以向我解释我做错了什么吗?如果我不应该使用这样的视图控制器,我应该如何设置一个有 10 个页面的游戏可以循环回到第一页?

4

2 回答 2

2
  1. 包括在你的 .m 而不是你的 .h 将解决你的问题
  2. 看看 UINavigationController
于 2012-02-22T22:57:51.387 回答
0

我认为正在发生的事情是,每个视图控制器类在其定义中都有一个下一页的实例,当我们到达最后一页时,添加第一页的实例会导致编译器不喜欢的循环。

我不认为是这样。在 Objective-C 中,对象不能包含在其他对象中,只能其他对象引用。也就是说,您永远不会将整个对象存储在变量中,您只会将指向对象的指针存储在变量中,因此在 C++ 中的对象可以包含另一个对象的意义上,一个对象不能包含另一个对象。

我不确定您的代码发生了什么,因为您没有向我们展示代码或错误,但这里是您可以让多个视图控制器相互引用的方法:

@interface MyViewController : UIViewController

@property MyViewController *next;

@end


// ...somewhere in your code...

MyViewController *vc1 = [[MyViewController alloc] initWithNibName:... bundle:...];
MyViewController *vc2 = [[MyViewController alloc] initWithNibName:... bundle:...];
MyViewController *vc3 = [[MyViewController alloc] initWithNibName:... bundle:...];

vc1.next = vc2;
vc2.next = vc3;
vc3.next = vc1;

现在,我在这里使用了三个完全相同类型的视图控制器,只是为了保持代码简短,但您不必这样做。他们甚至不一定都必须对next属性使用相同的名称。如果可以的话,我鼓励你避免视图控制器之间的依赖关系——你的每个视图控制器类真的需要知道下一个是什么类型吗?如果不这样做,您的代码将更易于管理,因此您可以根据需要轻松更改控制器的顺序。

于 2012-02-22T23:07:01.497 回答