【问题标题】:UIButton addTarget in different ViewControllerUIButton addTarget 在不同的 ViewController
【发布时间】:2015-09-24 02:55:23
【问题描述】:

在我的项目中,我有两个 ViewController——mapViewController 和 dataViewController。

在 mapViewController 中,我有两个按钮的插座:

@property (weak, nonatomic) IBOutlet UIButton *previousButton;
@property (weak, nonatomic) IBOutlet UIButton *nextButton;

用于在dataViewController中获取mapViewController,

 self.MapViewController = ((OTPAppDelegate *)[[UIApplication sharedApplication] delegate]).mapViewController;

使用上面的技术,我可以通过访问self.MapViewController.property来操作dataViewController内部mapViewController的属性

但是,如果我希望使用以下代码为 dataViewController 中的两个按钮添加目标:

 [self.MapViewController.previousButton addTarget:self action:@selector(doNothing:) forControlEvents:UIControlEventTouchDown];

它会引发 BAD 访问错误。我想知道需要修复什么,以实现所需的按钮点击行为。

【问题讨论】:

  • 你创建了mapview控制器的对象吗?
  • @Bhumika:我想是的。否则,操作其他属性应该不起作用,对吧?
  • 使用 nsnotificationcenter 或委托方法在另一个视图控制器中调用操作

标签: ios objective-c uiviewcontroller uibutton


【解决方案1】:

在 MapViewController 中创建协议

@Protocol prtocol_name <NSObject>{
 -(void)method_name;
@end

在 MapViewController 中为协议创建一个对象。

@property(nonatomic) id< prtocol_name> delegate;

在按钮方法实现中调用协议方法如下

[self.delegate method_name];

最后在DataViewController中实现协议方法。

谢谢

【讨论】:

    【解决方案2】:

    如果您希望目标/选择器位于不同的视图控制器中,则将委托参数作为其他视图控制器的实例传递。例如:

         [self.MapViewController.previousButton addTarget:otherControllerInstance     action:@selector(doNothing:)
    

    forControlEvents:UIControlEventTouchDown];

    详细说明:- 您有两个名为 FirstVC 和 SecondVC 的类。 FirstVC 中有一个按钮,您要在该按钮上添加 SecondVC 中的目标。

    [button addTarget:objSecondVC action:@selector(doSomething:)
       forControlEvents:UIControlEventTouchDown];
    

    【讨论】:

      【解决方案3】:

      我希望你已经将 mapViewController 的属性创建到 dataViewController 中。

      如果你选择了错误的属性属性,那么它可能会引发你得到的错误。

      另一种可能性是,MapViewController 属性未正确分配/初始化,当您尝试添加其子视图的目标时它为 nil。

      获取回调事件的最佳方式是使用委托。

      以下是有关委托工作原理的一些信息:

      委托是函数指针。使用它,可以轻松调用另一个类的函数。

      创建委托,一般流程是,首先创建协议并在其中添加相关方法(在你要发起委托方法的类中)。这些方法可以由采用协议的类来实现。

      您还需要创建称为委托属性的协议类型的通用属性。这将分配给符合协议的类的实例。

      在您的情况下,类 mapViewController 在其中定义了一些协议。这里,dataViewController 符合类 mapViewController 的协议。

      现在,类 dataViewController 中定义了类 mapViewController 的对象。在类 dataViewController 中,这里我们需要将类 mapViewController 的委托分配给 dataViewController(self) 的实例。 (现在在 mapViewController 类中,delegate 属性包含 dataViewController 的实例,并且可以轻松地从类 mapViewController 调用在类 dataViewController 中实现的协议方法)。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        相关资源
        最近更新 更多