我正在使用objective-C进行元编程,并尝试自动化一些应用程序功能。因此,我没有更改应用程序的源代码文件和视图控制器,而是从我正在管理的另一个文件中获取UI导航堆栈,我使用Objective-C Runtime Reference来查找可点击的UI元素和操作。例如,对于一个按钮,我找到了目标和动作,并调用objc_msgSend以编程方式触发事件。
step =(NSObject *)objc_msgSend(element.target,NSSelectorFromString(element.action));
但是我需要在操作完成后收到通知,或者换句话说,我需要等到操作完成后再继续我的自动化。我在考虑使用NSNotificationCenter
//举起一个活动 [[NSNotificationCenter defaultCenter] postNotificationName:FIRE_EVENT_NOTIFICATION object:self];
但看起来不像。
我甚至考虑使用Categories或 所以我不确定是否还有等待objc_msgSend以及我应该在哪里继续。
答案 0 :(得分:1)
目前还不完全清楚你要做的是什么以及你遇到的确切问题,但我会回答你的问题。
如果我理解正确你试图触发与UI元素相关联的动作,可能就像按下按钮一样。您在element
中引用了该元素,并且您希望在元素action
上调用关联的target
。以下假定操作为IBAction
。
最简单的方法可能是:
[element.target performSelector:element.action];
注意: element.action
几乎肯定会返回SEL
(选择器)而不是NSString
,因此无需通过{{1}运行它}。
通常情况下,NSSelectorFromString()
事件会将点击的元素作为参数接收,所以我认为您可能会这样做:
IBAction
[element.target performSelector:element.action withObject:element];
没有返回值,因此在方法返回时没有任何内容可以存储。
IBAction
和performSelector:
才会返回。您不应该组织某种行动完成的通知。
但是,如果您正在调用的操作是在另一个线程上启动代码,那么在按下按钮的结果完成之前,被调用的操作可能会返回。如果不了解正在运行的代码,就很难监控。
如果出于某种原因,您 使用performSelector:withObject:
,那么您将使用以下内容:
objc_msgSend
与objc_msgSend(element.target, element.action, element);
类似,performSelector:
只会在被调用方法运行完成时返回。
希望我理解你的问题,我的回答是有道理的,但我完全有可能在错误的树上狂奔。