也许我试图以错误的方式解决这个问题......
在我的主视图控制器中,我有三个按钮。 每个按钮都会导致加载不同的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子类。我现在唯一可以识别的选择真的很难看。
答案 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];
}