UIButton addTarget在不同的ViewController中

时间:2015-09-24 02:55:23

标签: ios objective-c uiviewcontroller uibutton

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

3 个答案:

答案 0 :(得分:0)

在MapViewController中创建协议

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

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

@property(nonatomic) id< prtocol_name> delegate;

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

[self.delegate method_name];

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

由于

答案 1 :(得分:0)

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

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

forControlEvents:UIControlEventTouchDown];

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

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

答案 2 :(得分:0)

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

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

另一种可能性是,MapViewController属性没有正确分配/初始化,当你试图添加其子视图的目标时它是零。

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

以下是有关委托如何运作的一些信息:

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

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

您还需要创建名为delegate property的协议类型的泛型属性。这将被分配给符合协议的类的实例。

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

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

我希望这会对你有所帮助。