«Контроллер» ориентирован на владение и фасад. Внешние объекты будут общаться с контроллером, а не с контролируемым. Единственный объект, который обычно должен напрямую общаться с UITableView
, это UITableViewController
. Контроллер, как правило, владеет контролируемым объектом, и срок службы контроллера должен быть, по крайней мере, таким же, как и у контролируемого объекта.
«Делегат» фокусируется на поведении, стратегии и наблюдателе. Объект запрашивает у своего представителя указания о поведении (я должен показать эти данные? Какого цвета это должно быть? Могу ли я выполнить это действие?). Объект сообщает своему делегату, когда происходят интересные вещи (я был тронут. Я собираюсь что-то закончить. У меня была проблема.) Специальный вид делегата отвечает на вопросы данных (какие данные поступают в строке 3?). Это так называемые источники данных.
В тех случаях, когда для остальной системы характерно общение с «контроллером», обычно нецелесообразно разговаривать с «делегатом». Так, например, обычно уместно иметь указатель на UITableViewController
и отправлять ему сообщения из других мест в системе. Неправильно иметь указатель на контроллер tableView
; Вы должны работать через контроллер. С другой стороны, если у вас есть указатель на объект, обычно нецелесообразно запрашивать его delegate
. Если вам нужно, вы, вероятно, разработали что-то неправильно. (Самым примечательным примером является [[NSApplication sharedApplication] delegate]
, с которым почти всегда нельзя говорить. AppDelegate - это делегат приложения, а не дамп для глобалов.)
Если объект имеет контроллер, контроллер почти всегда является делегатом. В соответствии с моими правилами, с которыми вы общаетесь, когда объект является и контроллером, и делегатом, тогда это контроллер.
Возможно, что один объект может быть делегатом нескольких вещей, особенно если большинство из них недолговечны (например, представления предупреждений). Для UIViewController
нет ничего необычного в делегировании нескольких вещей.