我正在使用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的方法,我应该在哪里继续。
发布于 2012-04-21 13:51:54
不完全清楚您正在尝试做什么,以及您遇到的确切问题,但我将尝试回答您的问题。
如果我理解正确的话,您正在尝试触发与UI元素相关联的操作,大概类似于按下按钮。您在element中有一个对元素的引用,并且希望在元素target上调用关联的action。下面假设该操作是一个IBAction。
要做到这一点,最简单的方法大概是:
[element.target performSelector:element.action];注意: element.action几乎肯定会返回一个SEL (选择器),而不是一个NSString,所以不需要通过NSSelectorFromString()运行它。
通常,IBAction事件会将点击的元素作为参数接收,所以我认为您可能希望这样做:
[element.target performSelector:element.action withObject:element];IBAction没有返回值,所以当方法返回时就没有什么可存储的了。
只有在被调用的方法运行完成后,performSelector:和performSelector:withObject:才会返回。你不需要组织一些动作完成的通知。
然而,,如果您调用的操作是在另一个线程上启动代码,则被调用的操作可能会在按下按钮的结果完成之前返回。如果不了解正在运行的代码,将很难对其进行监控。
如果出于某种原因,您必须使用objc_msgSend,那么您可以使用以下代码:
objc_msgSend(element.target, element.action, element);与performSelector:一样,objc_msgSend只有在被调用的方法运行到完成时才会返回。
希望我已经理解了你的问题,我的答案也是有意义的,尽管我完全有可能找错了人。
https://stackoverflow.com/questions/10252754
复制相似问题