繁体   English   中英

UIButton addTarget在不同的ViewController中

[英]UIButton addTarget in different ViewController

在我的项目中,我有两个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访问错误。 我想知道什么需要修复,以实现所需的按钮单击行为。

在MapViewController中创建协议

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

在MapViewController中为协议创建对象。

@property(nonatomic) id< prtocol_name> delegate;

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

[self.delegate method_name];

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

谢谢

如果要在另一个视图控制器中使用目标/选择器,则将委托参数作为其他视图控制器的实例传递。 例如:

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

forControlEvents:UIControlEventTouchDown];

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

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

我希望您将mapViewController的create属性添加到dataViewController中。

如果选择错误的属性,则会引发错误。

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

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

以下是有关委托工作方式的一些信息:

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

要创建委托,通常的过程是,首先创建协议并在其中添加相关方法(在要启动委托方法的类中)。 该方法可以通过采用协议的类来实现。

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

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

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

我希望这能帮到您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM