【问题标题】:Calling SEL from parentViewController in iOS在 iOS 中从 parentViewController 调用 SEL
【发布时间】:2011-09-04 15:09:58
【问题描述】:

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

setDateViewController.selectorName = @selector(myMethod:);

在我的模式中,我试图将这个 SEL 称为:

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

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

我没有收到任何错误或堆栈,但是,我父母上的这个 SEL(方法)从未被调用过。出于某种原因,我认为这应该可行,但有些事情告诉我我偏离了轨道。

谢谢。

【问题讨论】:

  • [self parentViewController] 是您想要的视图控制器还是 UINavigationController 实例?
  • [self parentViewController] 是我想要的控制器...它不是 UINav 实例

标签: objective-c ios uiviewcontroller


【解决方案1】:

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

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

像这样从父类调用。所以你可以动态地指定你想要调用的方法和对象,提供了更大的灵活性。

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

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

【讨论】:

    【解决方案2】:

    也许您会考虑向您的模态添加一个委托协议,以允许它调用父级上的方法。

    快速(未经测试)示例:

    // 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
    

    只需确保在创建模态控制器时将其委托设置为父级上的 self:

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

    【讨论】:

    • 是的...我以前看过这个...由于某种原因它不适合我...希望使其尽可能通用...但是,从我可以看到这似乎是事实上的标准......谢谢!
    • 你也可以使用块回调。
    • @Fabian -- 我已经接受了一个答案,但我对你的建议很好奇(一直在寻找新的做事方式);在 Obj-c 中详细说明?
    • this question的答案告诉你如何实现块回调。 SomeObjectBlockDelegate 类有两个块作为 iVar。这就是你需要做的。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2019-04-02
    • 2012-06-24
    • 2013-03-27
    • 2018-12-31
    相关资源
    最近更新 更多