presentingViewController

presentingViewController

我有使用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的支持,或者使代码将来取决于操作系统版本。

10-08 05:22