Один сборщик дат UIViewController для всех родительских контроллеров - PullRequest
1 голос
/ 08 декабря 2008

Не мог придумать интуитивно понятный способ перефразировать тему для этого вопроса, и я прошу прощения за это. Мой вопрос следующий:

У меня есть несколько UIViewController, которые нужно вызвать в UIDatePicker. Я не хотел создавать подкласс Date Picker несколько раз, так как это один и тот же интерфейс. У меня проблема с выяснением того, какие инструменты предоставляет Cocoa / Objective-C, чтобы я мог абстрагировать свой дочерний контроллер, поэтому ему не нужно знать, кто является родительским контроллером, который его создал. Родительский контроллер просто должен сообщить дочернему контроллеру, кто он, передавая себя в некоторую переменную экземпляра дочернего контроллера. Проблема в том, что дочерний контроллер не может получить доступ к методам / переменным экземпляра родительского элемента без импорта файла интерфейса класса. Это снова означает, что ребенок знает каждого отдельного родителя, который его называет.

В поисках оптимального способа решения этой, казалось бы, очень распространенной проблемы.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2008

Из вопроса не очевидно, создаете ли вы пользовательский подкласс UIDatePicker или просто реализуете методы делегата UIDatePicker в нескольких различных пользовательских подклассах UIViewController.

В любом случае, я думаю, что вам нужна комбинация делегата и протокола.

родительскому контроллеру просто нужно скажи ребенку, кто они , передавая себя некоторому ребенку переменная экземпляра контроллера

Это именно то, для чего полезен делегат. Объявите это в своем классе Objective C как идентификатор типа. Вы можете сделать это свойством, если вам нравится использовать обычную символику.

id delegate;

Теперь обратимся ко второму вопросу:

Проблема в том, что ребенок контроллер не может получить доступ методы / переменные экземпляра родитель без импорта класса файл интерфейса

Вы определенно не хотите обращаться к ivars напрямую, и в Objective-C вы всегда можете отправить любое сообщение любому объекту (вы получите предупреждение компилятора, но это не ошибка).

Существует способ избавиться от этих предупреждений, который называется Протоколы. Протокол похож на интерфейс Java; он позволяет вам определить список методов, а классы могут объявить, что они реализуют протокол.

Синтаксис для создания протокола выглядит следующим образом:

@protocol ProtocolName

- (void)sometMethod;

@end

Когда вы объявляете свой класс, вы говорите, что он реализует такой протокол:

@interface MyClass <MyProtocol>

Использование списка через запятую для реализации нескольких протоколов.

Последний трюк, который вы хотите знать, - это как определить указатель, который требует от правопреемника реализации определенного протокола. Возвращаясь к нашей реализации делегата ранее, мы можем добавить тот же синтаксис угловой скобки, который сообщает компилятору, что мы ожидаем, что объект, который мы назначаем для реализации этого протокола.

id<MyProtocol> delegate;

Вы можете объявить протокол в своем собственном файле, и вам нужно только импортировать этот файл протокола в любой класс, который использует протокол. Вы также можете использовать это в сочетании с предложением Августа выше и реализовать общую функциональность в объекте общего базового контроллера, имеющего каждый подкласс пользовательского контроллера в этой базе.

(еще один обзор протоколов: http://en.wikipedia.org/wiki/Objective-C#Protocols)

0 голосов
/ 08 декабря 2008

Вы можете иметь «базовый» контроллер вида, например BaseViewController. Этот контроллер будет иметь любой специальный код DatePicker в нем. Тогда все связанные контроллеры представления будут тогда подклассами этого базового контроллера. Настройте поведение по мере необходимости для каждого контроллера, но у вас все равно будет базовый код обработки выбора. Если вы используете одно перо для всех этих контроллеров, убедитесь, что для его класса объекта «Владелец файла» задан BaseViewController. Все подклассы по-прежнему смогут нормально обращаться к перу.

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