Я здесь предостерегаю: конкретный случай, который вы описываете, вероятно, не следует делать таким образом. Он почти наверняка слишком умный и, вероятно, его следует разделить на viewDidLoad
и viewWillAppear
, а не на две версии viewWillAppear
. Тем не менее, проблема действительно возникает.
Мое предпочтительное решение - сохранить SEL
, который указывает на то, что я хочу сделать. Например, я использую эту технику для «следующего действия» после сложной асинхронной операции:
if (self.nextActionSelector != NULL)
{
[self performSelector:self.nextActionSelector];
}
Таким образом, для этого вы можете использовать viewWillAppearSelector
, который будет изменяться с течением времени, а viewWillAppear
будет просто вызывать все, на что он указывает.
Рекомендация Бена о методе Swizzling полезна в некоторых случаях, но чаще, когда вы пытаетесь изменить поведение какого-либо существующего объекта, а не себя. Это может действительно сделать отладку веселой .... Хорошо, на самом деле не весело. Болезненные. Очень больно.
Помимо этого, я бы посмотрел на -forwardInvocation:
, который можно использовать для ответа на сообщения, которые вы непосредственно не реализуете. Затем вы можете переписать вызов, чтобы вызвать метод, который вам действительно нужен. Однако это не совсем то, что должно быть использовано. Это для прозрачной переадресации вызовов на другие объекты. Но, по крайней мере, отладка не так сложна, поскольку отладчик пойдет туда, куда вы ожидаете.
Обычно в этом случае, а не логическое значение, я ищу доказательства того, что я уже работал. Проверка, установлена ли уже view
, или какое-либо другое значение, которое инициализируется в первый раз, поэтому мне не нужна специальная переменная, и поэтому я устойчив к вещам, которые очищают мое состояние (например, практика iPhone по сбросу вещей, когда память в обтяжку). Там, где это возможно, я делаю эти вещи самоинициализирующимися в их получателях, вместо того, чтобы какая-то внешняя сторона имела специальную логику для первого раза. Простая логика делает обслуживание намного проще, и, эй, NSInvocation
сумасшедший медленный (хорошо, вы не заметите этого, кроме как в узком цикле, но это примерно в 500 раз медленнее, чем вызов метода в моих тестах. сказал, что я не предлагаю принимать это решение по производительности, просто ремонтопригодность).