Вот некоторый автономный HTML/JS, который добивается цели:
<html>
<head>
<script type="text/javascript">
function mkclr(cntl,clr) {
document.getElementById(cntl).style.backgroundColor = clr;
};
</script>
</head>
<body>
<form>
<input type="textbox" id="tb1"></input>
<input type="submit" value="Go"
onClick="javascript:mkclr('tb1','red');">
</input>
</form>
</body>
</html>
Не в среде выполнения. Все отправленные сообщения в конечном итоге завершаются вызовом функции в соответствии со строками objc_msgSend (получатель идентификатора, селектор SEL, / * аргументы метода * / ...)
. Как видите, информация об объекте, отправляющем сообщение, не передается. Вероятно, можно определить вызывающий объект путем обхода стека, но в этом заключается безумие. Единственный практический способ узнать, кто вызвал метод, - дать ему аргумент отправитель
, как и все методы IBAction.
Нет, вы не можете определить, какой объект вам звонил. Что ж, технически можно было бы обойти трассировку стека, но, конечно, это непрактично для реального кода.
Если вы посмотрите на большинство методов делегата, вы увидите, что стандартные форматы вызова делегата выглядят следующим образом :
- (NSSize) windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize;
- (BOOL) windowShouldClose:(id)window;
- (void) windowWillMove:(NSNotification *)notification;
Обратите внимание, как окно (вызывающий объект) передается в качестве первого аргумента, и как «окно» является первой частью имени метода. В последнем случае вызывающий окно неявно присутствует в NSNotification (notification.object - это окно).
You could try and derive your own class from NSInvocation
that carries the caller information. Or wrap a class around NSInvocation reimplementing some of the calls in there.