2013-08-25 2 views
0

Здравствуйте и благодарите за любую помощь заранее. Я пробовал искать, но кажется, что то, что я пытаюсь сделать, не является обычным явлением. Если есть другой пост, говорящий о моем вопросе, напишите ссылку.Класс передачи ObjectiveC Указатель на статическую библиотеку, а затем методы вызова из класса

Для начала у меня есть два класса. Чтобы имена были простыми, один называется Controller, а другой - AppDelegate. Контроллер представляет собой статическую библиотеку. AppDelegate создает экземпляр контроллера, используя следующее.

* Примечание: Я уже зарегистрировал _controller в файле .h.

_controller = [[Controller alloc] initWithAppDelegate:self]; 

Что я хотел бы сделать, это методы вызова в классе AppDelegate с контроллера. Соответствующий код в классе controller.h выглядит следующим образом.

@interface 
{ 
    id _appDelegate; 
} 

-(id) initWithAppDelegate:(id)appDelegate; 

и controller.m

-(void)someMethodName 
{ 
    [_appDelegate method]; 
} 

Проблема, которую я имею, что метод не доступен назвать. Я могу вызвать несколько других методов, но не пользовательские методы, созданные мной в AppDelegate. Я попытался заменить идентификатор AppDelegate, но я не могу импортировать AppDelegate, я несколько понимаю, почему я не могу его импортировать.

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

Спасибо.

ответ

0

Объявите протокол, как это в вашей статической библиотеке:

@protocol AppDelegateRequiredMethods 
@required 
... methods here ... 
@end 

Затем импортируйте заголовок, объявляющий этот протокол в ваши различные AppDelegate реализаций и объявить приложение делегат в реализации указанного протокол:

@interface MyAppDelegate:NSObject <AppDelegateRequiredMethods> 
... 
@end 
+2

После того, как у вас есть протокол, измените свойство/переменной экземпляра и инициализации методы: 'идентификатор _appDelegate;', '- (идентификатор) initWithAppDelegate: (идентификатор ) AppDelegate;' – Wain

+0

Awesome, Я считаю, что это сработает. Я отмечу как ответ, как только у меня будет больше времени для реализации. – n01d3a

+0

@Wain, спасибо за добавление дополнительной информации для ясности. Это решение отлично работало для меня. – n01d3a

0

Контроллер не знает делегата приложения или его методов. Вы должны объявить интерфейс, используя протокол.

@protocol AppDelegateMethods 
- (void)method; 
@end 

//Then replace your current id with  
id <AppDelegateMethods> 
+0

Использование 'id', как вы описали, добавляет хрупкость в код, потому что вы hamstrung способность компилятора гарантировать, что делегат приложения реализует методы. Делегат приложения должен быть объявлен в соответствии с протоколом, чтобы компилятор мог правильно проверить реализацию. – bbum

+0

@bbum исправил его, даже если он не называется тем же, что и идея –

+0

@bbum, эта часть относится к коду контроллера. Я не вижу проблемы, ведь комментарии к вашему собственному ответу предлагают одно и то же. –

Смежные вопросы