从iOS中的parentViewController调用SEL

时间:2011-09-04 15:09:59

标签: objective-c ios uiviewcontroller

我有一个ViewController,我在其中创建了一个Modal ViewController。我在我的模态中有一个SEL值,当我从父实例中实例化时,我设置了该值。

setDateViewController.selectorName = @selector(myMethod:);

在我的模态中,我试图将此SEL称为:

[[self parentViewController] performSelector:self.selectorName withObject:selectedDate afterDelay:.5]; 

{selectedDate}显然是我的模态中的一个值。

我没有得到任何错误或堆栈,但是,我的父亲的SEL(方法)永远不会被调用。出于某种原因,我认为这应该有效,但有些事情告诉我,我已经偏离了轨道。

感谢。

2 个答案:

答案 0 :(得分:1)

也许你会考虑在你的模态中添加一个委托协议,允许它在父节点上调用方法。

快速(未经测试)示例:

// MyController.h
@protocol MyControllerDelegate;
@interface MyController : UIViewController
{
    id<MyControllerDelegate> delegate;
}
@end

@protocol MyControllerDelegate <NSObject>
 - (void)methodToCall:(id)sender;
@end


// MyControler.m
@implementation MyController

- (void) loadView
{
    [super loadView];
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(20.0f, 20.0f, 50.0f, 30.0f);
    [btn setTitle:@"blah" forState:UIControlStateNormal];
    [btn addTarget:self.delegate 
         action:@selector(methodToCall:) 
         forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];
}

@end

// ParentController.h
@interface ParentController : UIViewController<MyControllerDelegate>
{
}
@end

// ParentController.m
@implementation ParentController

- (void)methodToCall:(id)sender
{
    NSLog(@"HERE");
}

@end

只需确保在创建模态控制器时,将其委托给父母的委托:

MyController *controller = [[MyController alloc] init];
controller.delegate = self;
[self presentModalViewController:controller animated:YES];

答案 1 :(得分:1)

我猜[self parentviewcontroller]没有返回任何内容。 试试UiviewController * v = [self parentviewcontroller];并检查是否为零。最有可能它应该是零。否则,如果它指向另一个不同类的对象,那么它就会崩溃。请做一件事。你应该设置bot你需要调用的对象和方法。如果有任何问题,IT部门将解决任何问题。

setDateViewController.selectorDelegate = self;
setDateViewController.selectorName = @selector(myMethod:);

从父类这样调用。因此,您可以动态指定方法,并且您要调用的对象可以提供更大的灵活性。

并使用,      [selectorDelegate performSelector:self.selectorName withObject:selectedDate afterDelay:.5];

这应该可以解决任何问题。