0

我有一个视图控制器(vc1),它使用另一个类来获取 UI 元素。因此,vc1 的视图将另一个从名为 Layout 的类返回的视图设置为子视图。从类 Layout 返回的视图包含一个 UIbutton。在 Layout 类中,我有以下代码:

[btn addTarget:self action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside];

然后在同一个类(布局)中,我还声明了方法 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里面的方法。你不这么认为吗?

4

2 回答 2

1

您的描述表明Layout您设置为按钮目标的实例在您按下按钮之前被释放,因此,当您按下它时,您使用的是无效指针。

检查正在保留Layout您正在使用的实例的内容,并确保它被保留(至少在它是按钮操作的目标的时间内)。

于 2014-09-16T20:28:55.797 回答
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 类中声明一个具有强属性的 Layout 类的属性。然后创建布局类的对象并用它实例化属性。

Layout *propertyName = [[Layout alloc] init];

现在,调用您的函数(让函数名称为 - getViewFromLayoutClass),它会返回您的视图,如下所示 -

[propertyName getViewFromLayoutClass]

现在,当您单击按钮时,它应该调用 Layout 类中的方法。

于 2015-12-29T10:56:47.530 回答