使用相同的指针指向不同的UIViewControllers

时间:2011-04-14 22:39:39

标签: iphone pointers uiviewcontroller

也许我试图以错误的方式解决这个问题......

在我的主视图控制器中,我有三个按钮。 每个按钮都会导致加载不同的UIViewController及其笔尖。

我使用单一方法来处理按钮触摸:

-(IBAction)touched_menu_button:(id)sender
{
SEL selector;

UIButton *button = (UIButton *)sender;

switch (button.tag) 
{
    case 0:
        selector = @selector(ShowA:finished:context:);
        break;

    case 1:
        selector = @selector(ShowB:finished:context:);
        break;

    case 2:
        selector = @selector(ShowC:finished:context:);
        break;

    default:
        selector = @selector(ShowA:finished:context:);
        break;
}

[self FadeOut:selector];
}

这里发生的事情是我在实际显示新视图之前运行了一个小动画。我用选择器调用“FadeOut”,该选择器将调用方法,该方法将在动画完成后显示相应的视图。这很好用。选择器调用的例程如下所示:

-(void)ShowA:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    A_ViewController *mvc = [[[A_ViewController alloc] init] autorelease];
    mvc.delegate = self;
    [self presentModalViewController:mvc animated:FALSE];
}

这也很好。

我想要做的是将其减少为选择器调用的单个方法,并将所有冗余代码放入我的“touching_menu_button”方法中。然后回调函数看起来像这样:

-(void)ShowNewView:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    [self presentModalViewController:mvc animated:FALSE];
}

显然这需要在“mvc”中传递一个不同的UIViewController子类,具体取决于我想要显示的视图。这就是我遇到麻烦的地方。也许这就是我已经连续12个小时编程而且我精神上受到了煎熬,但我似乎无法弄清楚如何做到这一点。我已经尝试将类变量定义为void ,void * ,id,UIViewController *和UIViewController **。出于某种原因,我似乎无法使其发挥作用。

我应该注意到许多方法都有效,但是当视图被取消并且自动释放过程发生时,它们会遇到麻烦。似乎我没有在我尝试过的所有排列中将指针的地址传递给UITableView子类。我现在唯一可以识别的选择真的很难看。

1 个答案:

答案 0 :(得分:1)

不是将对象传递给回调,而是可以传递类本身。

-(IBAction)touched_menu_button:(id)sender {
    Class theClass;

    UIButton *button = (UIButton *)sender;

    switch (button.tag) {
        case 0:
            theClass = [A_ViewController class];
            break;

        case 1:
            theClass = [B_ViewController class];
            break;

        case 2:
            theClass = [C_ViewController class];
            break;

        default:
            theClass = [A_ViewController class];
            break;
    }

    [self FadeOut:theClass];
}

FadeOut:然后使用该类作为动画的上下文信息:

- (void)FadeOut:(Class)theClass {
    //...
    [UIView beginAnimations:@"FadeOut" context:(void*)theClass];
    //...
    [UIView commitAnimations];
    //...
 }

如果您正在使用其他内容,则可以使用变量,因为您似乎正在尝试使用视图控制器对象。然后回调分配它给出的类。

-(void)ShowA:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    Class theClass = (Class)context; // or get it from a variable if you don't use the context
    // If the view controllers all have a shared superclass which declares the delegate property, you can specify that as the type and use dot notation, but otherwise you will need to call setDelegate:
    UIViewController *mvc = [[[theClass alloc] init] autorelease];
    [mvc setDelegate:self];
    [self presentModalViewController:mvc animated:FALSE];
}