Вопросы для начинающих разработчиков iPhone - PullRequest
3 голосов
/ 11 февраля 2011

Я недавно начал изучать программирование для iPhone и, пройдя многочисленные онлайн-уроки и книги (в большинстве из которых написано , напишите здесь , не предлагая объяснений почему или как все работает) У меня все еще есть много вопросов без ответа, и было бы здорово, если бы кто-то мог помочь мне прояснить их.

Вот так:

1) В Интерфейсном Разработчике, кто является владельцем файла, первым респондентом и делегатом, и где находится фактический код, который рисует представление?

2) При использовании Interface Builder и добавлении компонентов на экран я понимаю, что Interface Builder не пишет автоматически код для вас, но как мне обрабатывать события, инициированные различными компонентами? С точки зрения наилучшей практики проектирования, должен ли каждый компонент обрабатывать свои события в отдельном файле? (будет ли такой файл делегатом компонента?) или лучше просто заставить класс viewcontroller реализовывать все интерфейсы его компонентов?

3) При создании UITableView, например, и я определяю функцию:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [listOfItems count];
}

Я говорю, что объект tableView типа UITableView имеет эту функцию обратного вызова. Правильно? Поэтому в случае, если у меня есть другой UITableView с именем MyTableView, я должен написать такую ​​функцию:

- (NSInteger)MyTableView:(UITableView *)MyTableView numberOfRowsInSection:(NSInteger)section {
    return [listOfItems count];
}

Ответы [ 4 ]

5 голосов
/ 11 февраля 2011

Здесь есть несколько больших вопросов, на которые очень сложно ответить в сообщении о переполнении стека.

1)
А. Что такое владелец файла? Перо - это файл, верно? Так что бы иметь файл пера? Ну, владельцем является любой объект, который вы называете initFromNib: on.

AClassName *theOwner = [[AClassName alloc] initFromNib:@"nibfile"];

Файл пера - это просто высушенный объект, описание объекта, сериализация объекта. Объект часто лиофилизируют с помощью множества вспомогательных объектов, чтобы его можно было разморозить и готово к работе. Напомните мне, как египетские фараоны были похоронены со многими своими слугами и многими своими владениями, они были бы готовы отправиться в загробную жизнь. Владелец является основным объектом, который был заморожен. В замороженном состоянии (файл пера) владелец заморожен, и вы не можете с ним работать. Когда вы размораживаете загрузку nib-файла, основной объект, который размораживается, является владельцем.

B. Что такое первый ответчик? Когда вы взаимодействуете со своей программой, касаясь экрана, встряхивая телефон, печатая на клавиатуре, программа должна реагировать на это событие, многие другие платформы называют это обработкой событий или действий. Первый ответчик - это первый объект, который реагирует на взаимодействия пользователя. Обычно это будет NSView, к которому прикасается пользователь, который отвечает путем перерисовки и отправки обновленной информации в контроллер представления (помните, NSView наследуется от NSResponder - теперь вы знаете, почему).

Он находится в файле пера, так что вы можете переопределить типичное поведение. Cocoa Framework также используется для Mac, поэтому программистам может потребоваться, чтобы один объект обрабатывал ввод с клавиатуры, а не позволял каждому представлению обрабатывать сам ввод с клавиатуры. Это редко используется непосредственно в программах iPhone, потому что вы обычно хотите, чтобы пользователь касался реакции на взаимодействие с пользователем (перерисовывал сам) и передавал обновления. Таким образом, вы обычно можете просто игнорировать его в файле пера.

C. Что такое делегат? Что делает человек, когда делегирует? Они говорят кому-то еще сделать эту работу за них и отчитаться. Люди делегируют все время. Я делегирую починить мою машину автомеханику. Я делегирую приготовление ужина повару в ресторане, в котором я обедаю. «Джонсон, мне нужно, чтобы ты написал для меня отчет TMI», - сказал мой босс, делегировавший мне, потому что я был экспертом компании по TMI. Классы в коде ничем не отличаются.

Делегат в Интерфейсном Разработчике является делегатом Приложения. Класс UIApplication собирается передать ему множество обязанностей, отправляя сообщения методам, определенным в протоколе UIApplicationDelegate. Например, если ваш делегат реализует метод applicationDidFinishLaunching: , он получит сообщение после того, как экземпляр UIApplication инициализирует и завершит свою процедуру запуска.

D. Где чертежный код? Apple предоставила Framework в таких классах, как NSView, NSWindow, NSTableView, и она не имеет открытого исходного кода, поэтому вы не можете просматривать исходный код. Но причина, по которой окно запускается и появляется при первом запуске приложения, созданного на основе одного из шаблонов Apple, перед добавлением собственного кода, связана с тем, что происходит в файле main.m .

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

Вызов UIApplicationMain (argc, argc, nil, nil) начинает все вращаться. Он загружается в файл пера, чтобы разморозить объект UIApplication и другие объекты в файле пера. Затем он просит приложение запустить основной цикл. После размораживания объекта UIApplication (владельца пера) он сообщает, что его MainWindow следует отобразить на экране iPhone, и держит UIApplicationDelegate в цикле о том, что происходит.

Ну, это мой ответ на 1). Надо было написать время, надеюсь, это поможет. Одна вещь, которая действительно помогла мне понять: создание нового проекта приложения на основе окна, удаление MainWindow.nib, а затем попытка воссоздать его из пустого файла пера, чтобы он функционировал таким же образом.

2 голосов
/ 11 февраля 2011

Вот так:

  1. В Интерфейсном Разработчике:
    • "Владелец файла" - это класс Objective-C, к которому принадлежит ваш интерфейс.Обычно для контроллера представления это означает подкласс настраиваемого контроллера представления, который вы создаете.
    • «Первый респондент» в основном используется для скрытой обработки событий;он используется, чтобы выяснить, когда ваш класс и интерфейс обрабатывают события и когда передавать их по цепочке респондента.
    • «Делегат» - это общий термин для любого объекта, который получает сообщения о действиях другого объекта.В Интерфейсном Разработчике его иногда можно использовать для передачи действий между объектами или для ссылки на «делегат приложения», который является классом, который существует практически во всех проектах iOS и получает сообщения о поведении самого приложения.
  2. Для обработки событий из ваших компонентов графического интерфейса общепринятым является определение метода с типом возвращаемого значения IBAction в вашей реализации контроллера представления, а затем подключение его к событию изсоставная часть.Затем, когда это событие инициируется, вызывается ваш метод.Обычно нет необходимости разбивать их на множество отдельных файлов, если у вас нет очень сложной структуры.
  3. Не совсем.Если у вас есть другое табличное представление, вы можете назвать его myTableView, но вам все равно следует подключить его к тому же делегату табличного представления и источнику данных, и имя метода не изменится .Давайте разберем первую часть сигнатуры этого метода:
    • (NSInteger) означает, что этот метод возвращает целое число
    • Фраза tableView: является частью имени метода и не должна бытьизменилось.Табличное представление будет всегда вызывать метод tableView:numberOfRowsInSection: для требуемой информации, поэтому изменение на `MyTableView * приведет к сбою.
    • (UITableView *) означает, что первый аргумент имеет тип UITableView
    • tableView означает, что имя переменной внутри этого метода для вызывающей табличной таблицы: tableView

Подумайте о прочтении Руководство по программированию View Controller - оно охватывает множество этих концепций и ссылки на другие документы, в которых объясняется делегирование, представления таблиц и т. Д.

2 голосов
/ 11 февраля 2011

1.) Владельцем файла является (как правило) подкласс UIViewController, связанный с представлением, которое вы строите в IB (то, что вы называете GUI Builder, фактически называется Interface Builder)

First Responder, как правило, используется программой в фоновом режиме для указания того, что контролирует в данный момент (обычно с этим мало что делается)

Делегат - это файл, который получает действия, выполняемые в представлении (и, следовательно, должен реализовывать способы их обработки) (см. Ниже)

2.) Как правило, у вас будет файл кода ViewController для каждого Представления Интерфейсного Разработчика (Владелец файла). Обычно это где действия обрабатываются для определенных компонентов (скажем, нажав на кнопку). Вы будете устанавливать переменные (и методы для нажатия кнопок и т. Д.), Чтобы обрабатывать каждый компонент из IB (текстовое поле или кнопка - это IBOutlet, в то время как действие, подобное нажатию на кнопку, - это IBAction). Что касается лучшего дизайна, я верю вам должен иметь делегата для каждого представления, которое выполняет все вышеперечисленное, но я обычно просто использую ViewController в качестве делегата и реализую его там (для относительно простых представлений)

3.) Нет, имя параметра (которое в ваших примерах используют tableView и MyTableView) внутри используется для указания значения, которое вы передали. Когда вы вызываете эту функцию, вы бы назвали ее как [myTableView numberOfRowsInSection: 2]; и внутри функции все, что вам нужно из "myTableView", на самом деле ссылается на имя параметра tableView ... Это для любой функции, но для методов UITableViewDelegate (подобно тому, на который вы ссылаетесь, он будет вызываться автоматически UITableViewController если его делегат установлен в файл, вы определяете эту функцию.

Ух ты, оглядываясь назад, вот несколько блоков текста, мой лучший совет - получить Начиная разработку iPhone от Марка и Ламарша , она очень хорошо справляется со всем этим.

Я бы также предложил взглянуть на некоторые из самых простых примеров в документации Apple, чтобы получить представление о том, как правильно используется Interface Builder и делегаты.

Редактировать: как заметил комментатор, курс по Стэнфорду для iOS просто фантастический, и там я изучил основы (вместе с книгой выше)

0 голосов
/ 11 февраля 2011

См. Мой ответ на этот вопрос для объяснения того, что означает «загрузка файла xib», а также значения владельца файла и торговых точек.Возможно, это немного продвинуто для новичка, но если вы действительно хотите узнать «что» из того, что происходит, и выяснить, «почему это так» для себя, это, вероятно, хорошее чтение: Поместить UIView в заголовок UITableView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...