我有一个视图控制器(vc1),它使用另一个类来获取UI元素。 因此vc1的视图设置为子视图,从名为Layout的类返回另一个视图。 从类Layout返回的视图包含一个UI按钮。 在Layout类中,我有以下代码:
[btn addTarget:self action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside];
然后在同一个类(Layout)中我也声明了方法button_clicked:
- (void)button_clicked:(id)sender {
NSLog(@"btn clickd");
}
但是,当我点击按钮时会发生错误。我在调试区域看不到任何错误消息,但Xcode的状态看起来不太好。模拟器失去焦点,Xcode出现了一个文件(我猜它的AppDelegate.m)与这一行:
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
以绿色突出显示。 另外,在代码中我看到了消息:
线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x9)
可能有什么不对?我也担心vc1应该管理按钮点击,所以我认为最好放在vc1中的方法。你不这么认为吗?
答案 0 :(得分:1)
您的说明建议您在按下按钮之前释放设置为按钮目标的Layout
实例,因此,当您按下按钮时,使用无效指针。
检查保留您正在使用的Layout
实例的内容,并确保将其保留(至少保留为按钮操作目标的时间)。
答案 1 :(得分:0)
代码中设置的按钮目标 -
[btn addTarget:self action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside];
在您点击按钮之前,可能会被释放。
如果要在按钮上放置要调用的方法,请在视图控制器(vc1)内单击,您可以这样做。只需将按钮的目标从self更改为nil。
[btn addTarget:nil action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside];
然后在vc1中实现“button_clicked”方法。您的布局类中可能会警告“button_clicked”是未声明的选择器,您可以忽略它。
如果要在“布局”类中调用“button_clicked”方法,则可以执行此操作。在vc1类中声明具有strong属性的Layout类的属性。然后创建布局类的对象并使用它实例化该属性。
Layout *propertyName = [[Layout alloc] init];
现在,调用你的函数(让函数名为 - getViewFromLayoutClass),它返回你的视图如下 -
[propertyName getViewFromLayoutClass]
现在,当您单击按钮时,它应该调用Layout类中的方法。