Действительно ли возможно передать метод как аргумент в Objective C?

Для меня я хотел реализовать двухстороннее рукопожатие, то есть: - родительское окно будет загружаться быстрее iframe - iframe должен поговорить с родительским окном, как только он будет готов - родитель готов получить iframe message и replay

этот код используется для установки белой метки в iframe с использованием [CSS custom property] кода: iframe

$(function() {
    window.onload = function() {
        // create listener
        function receiveMessage(e) {
            document.documentElement.style.setProperty('--header_bg', e.data.wl.header_bg);
            document.documentElement.style.setProperty('--header_text', e.data.wl.header_text);
            document.documentElement.style.setProperty('--button_bg', e.data.wl.button_bg);
            //alert(e.data.data.header_bg);
        }
        window.addEventListener('message', receiveMessage);
        // call parent
        parent.postMessage("GetWhiteLabel","*");
    }
});

parent

$(function() {
    // create listener
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    var eventer = window[eventMethod];
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
    eventer(messageEvent, function (e) {
        // replay to child (iframe) 
        document.getElementById('wrapper-iframe').contentWindow.postMessage(
            {
                event_id: 'white_label_message',
                wl: {
                    header_bg: $('#Header').css('background-color'),
                    header_text: $('#Header .HoverMenu a').css('color'),
                    button_bg: $('#Header .HoverMenu a').css('background-color')
                }
            },
            '*'
        );
    }, false);
});

Естественно, вы можете ограничить исход и текст, это легко работать с кодом. Я нашел этот пример полезным: [Междоменные сообщения с postMessage]

21
задан eriaac 6 February 2009 в 08:54
поделиться

2 ответа

NSInvocation является классом для оборачивания вызовы метода в объекте. Можно установить селектор (сигнатура метода), установить аргументы индексом. Можно затем поставить цель, и вызов вызывают, чтобы инициировать вызов, или оставить целевой сброс и использовать invokeWithTarget: в каком-то цикле для вызова этого на многих объектах.

я думаю, что это работает немного как это:

NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];

for (MyClass *myObj in myObjects) {
  [inv invokeWithTarget:myObj];
}

Или если Вы не хотите передавать объекты вызова в этот метод, можно использовать тип SEL для принятия селектора (сигнатура метода).

-(void)fooWithMethod:(SEL)selector;

Затем присваивают селектор объекту вызова для вызова его на объектах.

25
ответ дан 29 November 2019 в 20:48
поделиться

Или если Вы используете эти fooWithMethod:(SEL)selector подход, просто сделайте [myObject performSelector:selector] на нем, если он не имеет никаких других аргументов.

См. NSObject для деталей .

10
ответ дан 29 November 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: