UIButton addTarget 在不同的 ViewController

Posted

技术标签:

【中文标题】UIButton addTarget 在不同的 ViewController【英文标题】:UIButton addTarget in different 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 或委托方法在另一个视图控制器中调用操作 【参考方案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 中实现的协议方法)。

希望对你有帮助。

【讨论】:

以上是关于UIButton addTarget 在不同的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

UIButton addTarget 在不同的 ViewController

UIButton 的 Swift addTarget 在 UIView 中不起作用

Swift4 - UIButton 在 UIView 中使用 addTarget 时出错

UIButton 上的 addTarget 不起作用

UIButton 类参考文档上的 addTarget 方法

UIButton.addTarget 无法正常工作。似乎是一个时间问题?