我有使用presentModalViewController方法呈现的UIViewControllers层次结构。
我有单身,把所有提出的视图控制器到一个数组。
例如,我介绍了控制器A,然后介绍了B,然后介绍了C。我将每个控制器插入索引0。
所以我有如下层次
C
乙
一种
这是我的单身汉
@implementation PresentHelper
- (id)init
{
self = [super init];
if (self) {
self.viewControllers = [NSMutableArray new];
}
return self;
}
+ (PresentHelper *)sharedInstance
{
static dispatch_once_t pred;
static PresentHelper *sharedInstance = nil;
dispatch_once(&pred, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (void)backToViewControllerA
{
for (UIViewController *controller in self.viewControllers) {
[controller dismissModalViewControllerAnimated:NO];
}
[self.viewControllers removeAllObjects];
}
@end
在
UIViewController
C中,我调用backToViewControllerA
方法。因此,当我调试此方法时,我想知道为什么
- viewDidLoad
方法(针对self.viewControllers中的每个控制器)在此行[controller dismissModalViewControllerAnimated:NO];
之后调用,因为我认为它不应该这样工作,但它可以工作。因此,也许这不是如何返回视图控制器A的一种方法,但是无论如何,我的问题都与viewDidLoad方法有关。
这也是我下面介绍每个控制器的代码。我有基类,每个都有(从它继承的A,B,C控制器)。
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
{
PresentHelper *presentHelper = [PresentHelper sharedInstance];
[presentHelper.viewControllers insertObject:modalViewController atIndex:0];
[super presentModalViewController:modalViewController animated:animated];
}
也收到此消息
NSArray在枚举时发生了变异
因此,正如我认为,解雇后我失去了目标,也许这是我的问题。
最佳答案
这似乎不适合使用Singleton。
您可以通过多种方法返回A。您不需要构造额外的委托方法或属性,因为每个控制器的presentingViewController
属性都引用了前一个方法。 (我要改写...对于iOS5 +,您可以使用内置的viewController属性presentingViewController
)。为了保持与iOS4.3的兼容性,请创建一个属性并将其放在基类@interface
中:
@property (nonatomic, assign) UIViewController* presentingController;
同样在基本clase接口中,声明一个方法:
- (void) dismissBackToA;
在
@implementation
中,@synthesize
您的属性并定义dismissBackToA
- (void) dismissBackToA
{
if ([[self presentingController] respondsToSelector:@selector(dismissBackToA)]) {
[[self presentingController] performSelector:@selector(dismissBackToA)];
}
}
在模态当前代码中,在所显示的VC中设置对self的引用-例如:
MasterViewController* BViewController = [[BViewController alloc] init];
BViewController.presentingController = self;
[self presentModalViewController:BViewController animated:YES];
现在,您要做的就是在AViewController子类中覆盖
dismissBackToA
:- (void) dismissBackToA
{
[self dismissModalViewControllerAnimated:YES];
}
这将允许您以菊花链方式链接任意数量的模态viewController ...通用
dismissBackToA
将链“展开”回A。A的override方法将消除其模态(B)。这将清除链中所有其他控制器。 presentController
几乎充当标准委托人的角色-我已对其进行了过度指定以强调其与iOS5 +中presentingViewController
的相似性。我对nonArc内存有点生疏,但是我认为需要分配不保留。恐怕我手头没有iOS4.3模拟器,无法对此100%进行测试...
更新
您也可以在整个链中一直传递对A的引用,并在需要时发送
[self.referenceToA dismissModalViewControllerAnimated:YES]
,但是这种方式有点通用。您还应该注意,
presentModalViewController:animated:
和dismissModalViewControllerAnimated:
在6.0中已被弃用:现在应该使用- presentViewController:animated:completion:
- dismissViewControllerAnimated:completion:
在5.0中引入。
它们仍然可以工作,但是以此为警告-您将必须准备放弃对4.3的支持,或者使代码将来取决于操作系统版本。