gpt4 book ai didi

objective-c - ios, UI 行为, 按钮

转载 作者:行者123 更新时间:2023-11-28 22:46:53 25 4
gpt4 key购买 nike

我是 ios 的新手,之前在 C# 中从事繁重的 UI 工作。我有一个应用程序,我想根据我代码中的某些逻辑来控制启用哪个按钮。为此,我创建了一个小方法来处理按钮的状态,如下所示:

-(void)activateUI:(BOOL *)activate {

[ validateDataBtn setEnabled: *activate ] ;
[ modifyCompDataBtn setEnabled: *activate ] ;
[ saveCompDataBtn setEnabled: *activate ] ;
}

所有这些 IBOutlet 都像这样绑定(bind)到 UI 按钮:

__weak IBOutlet UIButton *saveCompDataBtn;
__weak IBOutlet UIButton *modifyCompDataBtn;
__weak IBOutlet UIButton *validateDataBtn;

当我运行应用程序时,我在方法的第一行遇到异常:

[ validateDataBtn setEnabled: *activate ] ;

错误是EXC_BAD_ACCESS(代码=2,地址=0X0)我做错了什么?

最佳答案

编辑:我的,我的。我才意识到我把这件事搞得多么糟糕。

不正确:首先,您不应该使用 BOOL * , 如果你曾经使用过 BOOL *你会引用它作为 &activate , 不是 *activate . *在 C/Objective-C 中意味着变量是一个指针;它包含一个内存块的地址。 &取消引用指针以访问另一侧的值。

正确:一个*指示参数是一个指针,也用于引用指针。一个&在变量前面表示要使用变量在内存中的地址。我把它们混在一起了。这意味着您的原始代码是正确的;问题是您可能使用 [self activateUI:someBOOL] 来调用它,它传递一个 BOOL,然后由于 * 而尝试像指针一样引用它.

您可能会感到困惑,因为对象是作为 <object type> * 传递的因为所有用于处理对象实例的变量都是指针。然而,BOOL 是 typedef编辑到 int ,这是原始的,因此是 *不需要。你的方法应该是:

- (void) activateUI:(BOOL)activate {
[validateDataBtn setEnabled: activate];
[modifyCompDataBtn setEnabled: activate];
[saveCompDataBtn setEnabled: activate];
}

//called like this: [self activateUI: someBOOL];

如果你真的想传递一个指向 BOOL 的指针作为参数使用您最初编写的内容,但您需要这样调用它:

[self activateUI: &someBOOL];

如果您声明该方法以获取指向 BOOL 的指针( BOOL * ),并在方法体内取消引用它( *someBOOL ),您需要将地址传递给 BOOL ( &someBOOL ),而不是 BOOL本身。如果您声明采用 BOOL 的方法本身(只是 BOOL ),并直接在方法体中使用它( someBOOL ),你需要传递 BOOL本身 ( someBOOL )。

关于objective-c - ios, UI 行为, 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12991675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com