1

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

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

但是,我需要在操作完成时收到通知,或者换句话说,我需要等到操作完成,然后继续我的自动化。我正在考虑使用 NSNotificationCenter

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

但看起来不像工作。

我什至在考虑使用类别或所以我不确定是否有任何等待 objc_msgSend 以及我应该在哪里继续。

4

1 回答 1

1

目前尚不完全清楚您要做什么以及您遇到的确切问题,但我会尝试回答您的问题。

如果我理解正确,您正在尝试触发与 UI 元素相关的操作,大概是按下按钮之类的操作。你有一个对元素的引用,element并且你想action在元素上调用关联target。以下假设操作是IBAction.

最简单的方法可能是:

[element.target performSelector:element.action];

注意: element.action几乎可以肯定返回 a SEL(a selector) 而不是 anNSString所以没有必要通过NSSelectorFromString().

通常,一个IBAction事件会接收点击元素作为参数,所以我认为你可能想要这样做:

[element.target performSelector:element.action withObject:element];

IBAction' 没有返回值,因此当方法返回时没有任何内容可存储。

performSelector:并且performSelector:withObject:只有在被调用的方法运行完成后才会返回。您不需要组织某种动作完成通知。

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

如果由于某种原因,您必须使用,objc_msgSend那么您将使用以下内容:

objc_msgSend(element.target, element.action, element);

Like performSelector:,objc_msgSend只会在被调用的方法运行完成时返回。

希望我已经理解了您的问题并且我的回答是有道理的,但是我完全有可能在吠叫错误的树。

于 2012-04-21T05:51:54.383 回答