2014-09-17 2 views
0

У меня есть класс UIViewController, classA. Этот класс подключен к buttons выходам его подключенного вида (из раскадровки).Создание класса для ввода всех кнопок делегатов

Что я хотел бы сделать, это создать еще classB, который будет обрабатывать все действия кнопок. Вопрос в том, как я могу задать делегатам кнопки в classA, которые будут обрабатываться в classB, и как я могу сделать classB, чтобы быть живым на все это время.

Я думал об этом.

в CLASSA: (главный контроллер представления, которые имеют кнопки точек)

ClassB *buttonsResponder=[[classB alloc]init]; //initialize buttons class 
    [self.button addTarget:buttonsResponder action:@selector(do:) forControlEvents:UIControlEventTouchDown]; 

Моя главная проблема в том, когда ClassB обрабатывать действия, и позволяет сказать, что он должен открыть какой-нибудь почтовый композитор контроллер представления, как может ли классB открыть этот почтовый композитор «внутри» класса? или даже некоторые UIView, что я хочу показать в CLASSA, но отclassB

Я думал посылать указатель на текущий контроллер представления в качестве аргумента кнопки, но я не знаю, как, и если это будет работа:

[self.button addTarget: buttonsResponder действие: @selector (делать: и указатель контроллера?) forControlEvents: UIControlEventTouchDown];

+1

Держите сильную ссылку на ClassB в CLASSA. Сделайте экземпляр класса B как instanceVariable или свойство классаA, иначе он будет освобожден –

+0

спасибо, см. Мое редактирование, пожалуйста, я не упомянул о своей главной проблеме. – Curnelious

+0

Я предлагаю вам переосмыслить идею «classB» здесь. Если кнопки являются частью 'classA', то лучше обрабатывать действия только там, иначе у вас может быть веская причина для этого. Что-нибудь подобное? –

ответ

1

Лучший способ сохранить ClassB живым в случае CLASSA, делают это частная собственность в расширении класса:

// In CalssA 
@property (nonatomic, strong) ClassB *buttonsResponder; 

Вам нужно выделить его где-нибудь, viewDidLoad хорошее место:

self.buttonsResponder = [[classB alloc]init]; 

и одним и тем же способом вы можете сделать это нажав кнопку (ей):

[self.button addTarget:self.buttonsResponder action:@selector(do:) forControlEvents:UIControlEventTouchDown]; 

// Расширенная

Если вы хотите представить другой контроллер представления от вашего ClassB вы можете создать свойство удерживать слабую ссылку на CLASSA в ClassB:

// In ClassB.h 
@property (nonatomic, weak) ClassA *myClassA; 

передать ссылку на из CLASSA когда инициализирует ClassB в viewDidLoad:

// In ClassA.m 
self.buttonsResponder = [[classB alloc]init]; 
self.buttonsResponder.myClassA = self; 

И когда вы хотите представить другой контроллер представления вы можете сделать это из ClassB:

[self.myClassA presentViewController:...]; 
+0

Спасибо, см. Мое редактирование, пожалуйста. моя проблема заключается в том, что если в ответ на это действие я хотел бы представить другой контроллер представления, как я могу сделать это из этого класса B? см. мое редактирование. – Curnelious

+0

@ Корнелигий, пожалуйста, см. Расширенный ответ. – Greg

+0

спасибо, это похоже на лучший подход, чем открыть его в контроллере корневого представления (правда?) – Curnelious

1

[self.button addTarget: self.buttonResponder action: @selector (do :) forControlEvents: UIControlEventTouchDown];

Если вы хотите представить другой ViewController из buttonsResponder:

[self.window.rootViewController presentViewController:anotherViewController animated:YES completion:nil]; 
+0

круто это хороший подход! но в то время он всегда должен быть моим корневым представлением. как насчет передачи текущего контроллера в качестве указателя? – Curnelious

+0

и что-то еще, почтовый композитор должен установить и зарегистрироваться для делегирования, как и кто регистрируется, чтобы получить делегата? это не будет класс B, я думаю? – Curnelious

+0

хорошо .. в этом случае .. да. лучше передать его как указатель –

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