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 中不起作用