首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用objc_msgSend后如何继续

调用objc_msgSend后如何继续
EN

Stack Overflow用户
提问于 2012-04-21 03:59:21
回答 1查看 300关注 0票数 1

我正在使用objective-C进行元编程,并尝试自动化一些应用程序功能。因此,我没有更改应用程序的源代码文件和视图控制器,而是从另一个文件中获取UI导航堆栈,并使用Objective-C Runtime Reference查找可点击的UI元素和操作。例如,对于一个按钮,我找到了目标和操作,并调用objc_msgSend以编程方式触发事件。

步骤= (NSObject *)objc_msgSend(element.target,NSSelectorFromString(element.action));

然而,当操作完成时,我需要得到通知,换句话说,我需要等到操作完成,然后继续我的自动化。我在考虑用NSNotificationCenter

//引发事件[NSNotificationCenter defaultCenter postNotificationName:FIRE_EVENT_NOTIFICATION object:self];

但看起来行不通。

我甚至在考虑使用Categories,所以我不确定是否有等待objc_msgSend的方法,我应该在哪里继续。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-21 13:51:54

不完全清楚您正在尝试做什么,以及您遇到的确切问题,但我将尝试回答您的问题。

如果我理解正确的话,您正在尝试触发与UI元素相关联的操作,大概类似于按下按钮。您在element中有一个对元素的引用,并且希望在元素target上调用关联的action。下面假设该操作是一个IBAction

要做到这一点,最简单的方法大概是:

代码语言:javascript
复制
[element.target performSelector:element.action];

注意: element.action几乎肯定会返回一个SEL (选择器),而不是一个NSString,所以不需要通过NSSelectorFromString()运行它。

通常,IBAction事件会将点击的元素作为参数接收,所以我认为您可能希望这样做:

代码语言:javascript
复制
[element.target performSelector:element.action withObject:element];

IBAction没有返回值,所以当方法返回时就没有什么可存储的了。

只有在被调用的方法运行完成后,performSelector:performSelector:withObject:才会返回。你不需要组织一些动作完成的通知。

然而,,如果您调用的操作是在另一个线程上启动代码,则被调用的操作可能会在按下按钮的结果完成之前返回。如果不了解正在运行的代码,将很难对其进行监控。

如果出于某种原因,您必须使用objc_msgSend,那么您可以使用以下代码:

代码语言:javascript
复制
objc_msgSend(element.target, element.action, element);

performSelector:一样,objc_msgSend只有在被调用的方法运行到完成时才会返回。

希望我已经理解了你的问题,我的答案也是有意义的,尽管我完全有可能找错了人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10252754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档