我可以使用 Objective-C 将块作为 @selector 传递吗?

2024-02-10

是否可以传递一个 Objective-C 块@selector论证中的一个UIButton?即,有什么办法可以让以下工作发挥作用吗?

    [closeOverlayButton addTarget:self 
                           action:^ {[anotherIvarLocalToThisMethod removeFromSuperview];} 
                 forControlEvents:UIControlEventTouchUpInside];

Thanks


是的,但是您必须使用类别。

就像是:

@interface UIControl (DDBlockActions)

- (void) addEventHandler:(void(^)(void))handler 
        forControlEvents:(UIControlEvents)controlEvents;

@end

实现会有点棘手:

#import <objc/runtime.h>

@interface DDBlockActionWrapper : NSObject
@property (nonatomic, copy) void (^blockAction)(void);
- (void) invokeBlock:(id)sender;
@end

@implementation DDBlockActionWrapper
@synthesize blockAction;
- (void) dealloc {
  [self setBlockAction:nil];
  [super dealloc];
}

- (void) invokeBlock:(id)sender {
  [self blockAction]();
}
@end

@implementation UIControl (DDBlockActions)

static const char * UIControlDDBlockActions = "unique";

- (void) addEventHandler:(void(^)(void))handler 
        forControlEvents:(UIControlEvents)controlEvents {

  NSMutableArray * blockActions = 
                 objc_getAssociatedObject(self, &UIControlDDBlockActions);

  if (blockActions == nil) {
    blockActions = [NSMutableArray array];
    objc_setAssociatedObject(self, &UIControlDDBlockActions, 
                                        blockActions, OBJC_ASSOCIATION_RETAIN);
  }

  DDBlockActionWrapper * target = [[DDBlockActionWrapper alloc] init];
  [target setBlockAction:handler];
  [blockActions addObject:target];

  [self addTarget:target action:@selector(invokeBlock:) forControlEvents:controlEvents];
  [target release];

}

@end

一些解释:

  1. 我们正在使用一个名为“仅限内部”的自定义类DDBlockActionWrapper。这是一个简单的类,具有一个块属性(我们想要调用的块)和一个简单调用该块的方法。
  2. The UIControl类别只是实例化这些包装器之一,为其提供要调用的块,然后告诉自己使用该包装器及其invokeBlock:方法作为目标和操作(正常)。
  3. The UIControl类别使用关联对象来存储数组DDBlockActionWrappers, 因为UIControl不保留其目标。该数组用于确保块在应该被调用时存在。
  4. 我们必须确保DDBlockActionWrappers当对象被销毁时被清理,所以我们正在做一个令人讨厌的 swizzling out 的黑客攻击-[UIControl dealloc]使用一个新的对象来删除关联的对象,然后调用原始对象dealloc代码。棘手,棘手。 事实上,关联对象在释放期间会自动清理 http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocAssociativeReferences.html#//apple_ref/doc/uid/TP30001163-CH24-SW3.

最后这段代码是在浏览器中输入的,并没有被编译。可能有一些问题。你的旅费可能会改变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用 Objective-C 将块作为 @selector 传递吗? 的相关文章

  • ios 导航 堆栈操作

    我在尝试从 iOS 应用程序操作导航堆栈时遇到问题 或者至少是由于这种操纵而产生的行为 我的情况 我有 3 个 ViewController 控制器a显示多个级别 控制器 b 是游戏视图 控制器 c 是某种分数 显然 我将在控制器 a 中选
  • DatePicker 停止 CoreData 按预期工作

    我有一个应用程序 它保存 UIDatePicker 中的文本和日期 然后在您回到 UIDatePicker 中的该日期时显示该注释 效果很好 只有我发现将 UIDatePicker 日期设置为今天会停止 CoreData 工作 只有当我运行
  • 从命令行调试 iOS 应用程序构建

    我正在通过命令行构建 iOS 应用程序 但在调试它时遇到问题 如果我使用 XCode 进行构建 它会让我在设备上 构建和调试 而不会出现任何问题 但现在 我不知道如何使用 gdb 在设备上启动它并逐步执行它 如果我尝试 添加自定义目标 可执
  • 如何解决 CoreData mogenerator 未找到问题

    我收到如下所示的错误 我不知道我错过了什么 我该如何解决这个问题 如下图所示 Users nischalhada Documents XcodePro mnepalnews revisited 2 0 CoreData mogenerato
  • 错误域=AVFoundationErrorDomain代码=-11814“无法记录”

    它不断给我错误 错误域 AVFoundationErrorDomain代码 11814 无法记录 我不确定问题是什么 我试图在拍照后计数器达到 1 时录制声音 static int counter counter will always b
  • 确定 Objective-C 方法在运行时是否是可变的

    有没有办法在运行时找出给定方法是否是可变参数类型 就像是method getTypeEncoding 这不会告诉我一个方法是否接受可变数量的参数 或者有什么技巧可以告诉我们吗 罗伯特的评论是正确的 考虑 interface Boogity
  • 推入 UINavigationController 时隐藏 FBFriendPickerViewController 导航栏

    介绍一个实例FBFriendPickerViewController using presentViewController animated completion 非常简单 该类似乎是针对该用例的 但是 我想推送一个实例FBFriendP
  • UIImagePickerView 控制器 - 图像路径 - iphone

    UIImagePickerView控制器返回NSData的图像 我的要求是将图像的路径存储为 varchar 数据类型 从中选择图像后UIImagePickerView 如何获取iPhone照片库中所选图片的完整路径 我的应用程序不必担心在
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • iphone NSDate 转换问题

    在我的 facebook 图表 Api 中 我正在获取这些数据 来自杰森 updated time 2011 05 17T14 52 16 0000 我正在使用此代码将其转换为有效的日期格式 NSDateFormatter df NSDat
  • 拖动时获取MKAnnotation的坐标

    我正在根据用户添加的注释的位置创建一条路径 MKPolyline 我想允许用户通过拖动引脚来更改路径 我目前可以做到这一点 但 MKPolyline 不会更新 直到引脚被放下 我实施了 void mapView MKMapView mapV
  • 如何在iOS应用程序中捕获用户的手写签名[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在我的应用程序中 用户将请求客户提供数字化的手写签名 我需要能够在用户在触摸屏上 书写 签名时捕获签名
  • 两者都实现了类。将使用两者之一

    我有一个项目 它具有使用 SocketRocket 的依赖项 通过 CocoaPods 安装 并从 HeapAnalytics 导入了静态库 显然 HeapAnalytics 库已经使用了 SocketRocket 编译时没有出现错误 但在
  • 如何在 ios 7 上更改重新排序控制图像

    我正在寻找一种更改重新排序控件图像和大小的方法 我使用此代码来更改重新排序图像 void tableView UITableView tableView willDisplayCell UITableViewCell cell forRow
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • 玻璃效果 UIView

    我想知道如何在 UIView 上添加玻璃效果 我想像这样的效果 http pttrns com pickers detail 0dc9d9f6c6a7577613b3453768eee3b3在灰色半透明视图上 您 可以在这里看到 Thank
  • 您将如何实现一个检测水平滑动以允许分页的 UITableView?

    我想实现一个 UITableView 一次显示 20 行 但考虑到我实际上可能要展示 120 个项目 我想使用某种分页来处理这个问题 使用前 20 项填充表 当用户从右向左滑动时 用接下来的 20 个项目重新加载 UITableView 从
  • 线程 1:信号 SIGABRT - AppDelegate.h

    main m Journey Created by Julian Buscema on 2014 07 13 Copyright c 2014 Julian Buscema All rights reserved import
  • 我什么时候应该对 IBOutlet 使用弱或强限定符? [复制]

    这个问题在这里已经有答案了 可能的重复 ARC 下 IBOutlets 应该强还是弱 https stackoverflow com questions 7678469 should iboutlets be strong or weak
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要

随机推荐

  • 控制器外部的 Spring 异常处理程序

    In ControllerAdvice类我有一个 ExceptionHandler 这个处理程序可以很好地处理控制器错误 但如果我有一个过滤器 它们就无法处理异常 我该如何处理这些异常 过滤器是 public class AuthFilte
  • python 3 中 math.isnan 、numpy.isnan 和 pandas.isnull 之间有什么区别?

    A NaN类型为decimal Decimal的原因 math isnan 返回 True numpy isnan 抛出 TypeError 异常 pandas isnull 返回 False math isnan numpy isnan
  • 如何使用curl解码“Content-Encoding:gzip,gzip”?

    我正在尝试使用以下代码使用 CURL 解码网页 www dealstan com ch curl init curl setopt ch CURLOPT URL url Define target site curl setopt ch C
  • 在 gwt 中上传到服务器之前在客户端上显示图像

    我想在将图像上传到服务器之前在客户端上显示图像及其尺寸 每当我尝试创建一个Imagegwt ext 的小部件 它不接受本地文件 在文件系统上 它只接受http请求 我也尝试过String img GWT getHostPageBaseURL
  • 在MAMP上安装Mongo驱动

    我已经下载 编译并安装了最新的 mongo php 驱动程序 它位于 opt local lib php extensions no debug non zts 20090626 mongo so 我该如何将其添加到 MAMP php in
  • 访问存储正则表达式的二维数组以进行表单验证

    我正在尝试循环遍历表单字段并针对存储在数组中的正则表达式进行验证 看不出这里出了什么问题 有什么想法吗
  • 如何在 keras 生成器中使用 numpy memmap 不超过 RAM 内存?

    我正在尝试在生成器内实现 numpy memmap 方法 以使用 keras 训练神经网络 以免超出内存 RAM 限制 我用这个作为参考post https stackoverflow com questions 45132940 nump
  • BLUEZ 中的 DBUS API

    我是 BLUEZ 和 Linux 的新手 我发现 Bluez 提倡使用 DBUS API 我还想知道 BLUEZ 中的 DBUS API 是什么 使用它们而不是直接的 C API 有什么好处 与 C API 相比有何不同 从我自己的经验来看
  • 如何使用 Mockito 在 Flutter 中模拟静态方法?

    我有一个文件函数fetchPosts 它负责从服务器获取新帖子并将其存储在本地 sqlite 数据库中 正如 sqflite 上的推荐doc https github com tekartik sqflite blob master sqf
  • Rails 3.1 错误捕获

    我认为 Rails 3 1 正在改变引发错误的方式 任何人都可以协助或确认这一点吗 我正在尝试使用 Rails 3 1 0 rc1 创建自定义错误页面 unless config consider all requests local re
  • LinearLayout achartengine 图表不显示在 ScrollView 中

    我正在尝试在滚动视图中创建 achartengine 图表 但它不会显示 它只显示黑屏 但不会崩溃或发生任何情况 问题是 如果我只是将标签更改为图表显示就好了 在我的 Java 代码中 我确实有 renderer setInScroll t
  • 使用 Modernizr 加载脚本...不工作

    我在尝试使用 Modernizr 版本的 yepnope 加载脚本时遇到问题 并且无法理解它们为何不同 如果我使用 yep nope 加载脚本 它可以正常工作
  • NSubstitute DbSet / IQueryable

    因此 EntityFramework 6 比以前的版本具有更好的可测试性 还有一些很好的例子 http msdn microsoft com en us data dn314429 queryTest在互联网上寻找像 Moq 这样的框架 但
  • 排序忽略标点符号 (Objective-C)

    我正在尝试对 iOS UITableView 对象进行排序 我目前正在使用以下代码 Sort terms alphabetically ignoring case self termsList sortUsingSelector selec
  • 如何查找映射驱动器的可用空间百分比?

    是否可以以编程方式查找映射驱动器中的可用空间 如何使用 ms dos 查找驱动器中可用空间的百分比 在硬盘中找到驱动器的可用空间可能很容易 但我需要找到映射驱动器的可用空间 我已经在我的系统中映射了一些文件服务器 可以在 我的电脑 中看到它
  • Octave并行计算

    我在网上找到了一些资料 表明 Octave 有一些工具可以并行化算法 但找不到任何细节或如何获取和使用它们 对此的任何帮助 见解都会很棒 http octave sourceforge net parallel http octave so
  • VSO 和单个产品团队的多个项目

    我们有一个由大约 10 名开发人员组成的团队正在开发新产品 我们已将此产品拆分为 Visual Studio Online 上的两个团队项目 开发人员可以在任何一个冲刺期间同时处理这两个项目 尽管我们有两个团队项目 但整个团队作为一个敏捷单
  • 如何解决:引用的 AMP URL 不是 AMP

    搜索控制台添加了一系列 引用的 AMP URL 不是 AMP 的问题 如果我使用 I get 然而 当我登记入住时https validator ampproject org https validator ampproject org 表
  • R 的同比百分比变化

    虽然我发现了几个类似的问题 但我无法在基础 R 中找到解决我的问题的简单方法 我想计算一组数据 此处为 y 值 的同比百分比变化 并将此 Delta 系列作为新列添加到我的数据框中 例如 gt x c 2000 2001 2002 2003
  • 我可以使用 Objective-C 将块作为 @selector 传递吗?

    是否可以传递一个 Objective C 块 selector论证中的一个UIButton 即 有什么办法可以让以下工作发挥作用吗 closeOverlayButton addTarget self action anotherIvarLo