gpt4 book ai didi

ios - 将变量添加到 block

转载 作者:行者123 更新时间:2023-11-28 19:49:41 24 4
gpt4 key购买 nike

我正在使用 UIAlertView + block 类别 found here .

我无法理解他是如何创建积木的:

typedef void (^DismissBlock)(int buttonIndex);

我明白这一点,用它来创建我自己的 block 。所以我创建了我的:

typedef void (^DismissBlockWithView)(UIAlertView *alertview, int buttonIndex);

我想我明白 setter 方法发生了什么:

- (void)setDismissBlock:(DismissBlock)dismissBlock
{
objc_setAssociatedObject(self, &DISMISS_IDENTIFER, dismissBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

据我了解,这是设置变量的较低级别的方法。我不确定应该在何处、何时或为何使用它。如果我弄错了,请纠正我。它将 DIMISS_IDENTIFER 的引用值设置为 dismissBlock 对象。

所以对于我的 block :

-(void)setDismissBlockWithView:(DismissBlockWithView)dismissBlockWithView {
objc_setAssociatedObject(self, &ALERT_VIEW, dismissBlockWithView, OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &DISMISS_IDENTIFER, dismissBlockWithView, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

我设置了每个变量。

现在我难以理解的部分是 getter 方法:

- (DismissBlock)dismissBlock
{
return objc_getAssociatedObject(self, &DISMISS_IDENTIFER);
}

因此 objc_getAssociatedObject() 接收 id objectconst void *key 变量。以这种方式创建 block 时,您只能有一个变量吗?我知道我不知道所有这一切背后的基本逻辑,只是有点尝试使用常识逻辑将它们放在一起。

我需要做什么来改变它,以便返回 UIAlertView 和 buttonIndex?

我想要返回 UIAlertView,因为我正在通过它接收用户输入(使用 UIAlertViewStylePlainTextInput 样式选项)并且文本存储在警报 View 中。

最佳答案

objective-c 关联引用方法是运行时 API 的一部分,它允许您在运行时将对象“附加”到其他对象。在您的情况下,您将 block 与警报 View 相关联,允许您在必要时访问这些 block (例如,当警报被解除时)。

代码中的 DIMISS_IDENTIFER 只是关联键,稍后您可以使用它来检索关联的对象 - block 。将其视为存储关联对象并用于标识它的字典的键。

您可以为每个键关联一个对象。在 setDismissBlockWithView 方法中,您将同一 block 与警报 View 相关联,但使用不同的键,我认为这没有多大用处。您创建的新区 block 签名就可以了,您可以在执行区 block 时通过警报 View 。例如,我修改了 UIAlertView+MKBlockAdditions 中的一种方法,以使用您的签名调用 dismissBlock,同时将警报 View 和索引传递给该 block :

+ (void)alertView:(UIAlertView*) alertView didDismissWithButtonIndex:(NSInteger) buttonIndex {
if(buttonIndex != [alertView cancelButtonIndex]){
if (alertView.dismissBlock) {
alertView.dismissBlock(alertView, buttonIndex - 1);
}
}
}

关于ios - 将变量添加到 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29952891/

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