【问题标题】:how to continue after calling objc_msgSend调用 objc_msgSend 后如何继续
【发布时间】:2012-04-20 19:59:21
【问题描述】:

我正在使用 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 以及我应该在哪里继续。

【问题讨论】:

    标签: objective-c metaprogramming objective-c-runtime


    【解决方案1】:

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

    如果我理解正确,您正在尝试触发与 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 只会在被调用的方法运行完成时返回。

    希望我已经理解你的问题并且我的回答是有道理的,但我完全有可能是在找错树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-25
      • 2022-11-20
      • 1970-01-01
      • 2017-07-29
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多