2015-05-20 4 views
-2

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

enter image description here

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

LeftViewController *sampleProtocol = [[LeftViewController alloc]init]; 
LeftViewController.delegate = self; 

Im мышления я не нужно, чтобы создать новый LeftViewController, так как он поместить его уже в моем списке дочерних контроллеров. Поэтому мой вопрос заключается в том, как получить контроллер из списка дочерних контроллеров и установить родительский элемент в качестве делегата. Я знаю, что это массив, и я могу использовать objectAtIndex, но как узнать, что порядок элементов в массиве не изменится, я не могу назвать его, кроме тега или идентификатора? Спасибо за любую помощь, извините, если вопрос не настолько ясен, что я впервые установил делегатов.

+0

Не используйте индекс, добавляйте конкретную розетку/свойство и устанавливайте контроллер в том, что нужно использовать. – Wain

+0

Для чего-то с таким количеством просмотров данных, я бы создал общий класс диспетчера данных центрального экземпляра, который обрабатывает все ваши данные. Затем вы создаете каждый контроллер представления с набором данных из вашего диспетчера данных. Разрешить контроллерам регистрироваться для уведомлений об обновлении из экземпляра диспетчера данных. Когда контроллер что-то изменяет, при совершении изменения все зарегистрированные заинтересованные контроллеры будут уведомлены и могут решить, что для них означает это изменение. API для каждого контроллера затем сводится к простому перехвату, чтобы вводить те элементы данных, на которые они смотрят/управляют. –

ответ

1

Я знаю, что для этого лучше всего использовать делегатов.

В этом случае я не был бы так уверен. Я думаю, что лучшим вариантом было бы иметь надежную модель и использовать KVO и notifications, чтобы сигнализировать об обновлениях между контроллерами представлений.


Прямой ответ на ваш вопрос не так уж плох.

for (UIViewController *viewController in self.childViewControllers) { 
    if ([viewController isKindOfClass:[LeftViewController class]]) { 
     LeftViewController *leftViewController = (id)viewController; 
     leftViewController.delegate = self; 
     break; 
    } 
} 

Я думаю, что незначительное улучшение на это было бы использовать SEGUE. Убедитесь, что каждый из контейнеров имеет имя segue. В этом примере контроллер левого представления имеет сегмент с идентификатором «Load Child LeftViewController».

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Load Child LeftViewController"]) { 
     LeftViewController *leftViewController = segue.destinationViewController; 
     leftViewController.delefate = self; 
    } 
} 
+0

Спасибо, prepareForSegue сделал трюк :). –

-1
Its always better to use NSNotificationCenter for such complex mechanism. 

*** put following code in LeftController.m ***

// *** Register a Notification to recieve a Data when something happens in Center controller *** 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(receivedNotification:) 
              name:@"hasSomeData" 
              object:nil]; 

// *** create a method to receive Notification data *** 
- (void)receivedNotification:(NSNotification *) notification { 
    if ([[notification name] isEqualToString:@"hasSomeData"]) 
    { 
     // do your stuff here with data 
     NSLog(@"data %@",[notification object]); 
    } 
} 

*** when something happen in center controller post a notification to inform Left Controller ***

[[NSNotificationCenter defaultCenter] postNotificationName:@"hasSomeData" object:self]; 
-1
//Secondvc.h 
    @protocol Sendmessage<NSObject> 
    @required 
    -(void)Object:(NSArray *)tosend; 
    @end 
    @interface Secondvc:UIViewcontroller{ 
    id <Sendmessage> delegate; 
    } 
    @property(strong,nonatomic) id <Sendmessage> delegate; 
    @end 

    //Secondvc.m 
    @implementation Secondvc 
    @synthesize delegate; 
    -(void)viewDidLoad{ 
    //Do Something here! 

    } 
    //Pass Some Value When a button event occured in Second vc 
    -(IBAction)Send_Data{ 
    [self dismissViewControllerAnimated:Yes completion:nil]; 
    [self.delegate Object:[NSArray Arraywithobjects:@"Hello",nil]]; 
    } 
    @end 


    //FirstVc.h 
    #import "Secondvc.h" 
    @interface FirstVc<Sendmessage> 
    @end 

    //FirstVc.m 
    @implementation FirstVc 
    -(void)viewDidLoad{ 
    Secondvc* Object=[[Secondvc alloc]init]; 
    Object.delegate=self; 
    } 
    #pragma mark Secondvc Deklegate method implementation 
    -(void)Object:(NSArray *)tosend{ 
    NSLog(@"Recieved data Form Second VC Is:\n%@",tosend); 
    } 
    @end 

НТН! Наслаждайтесь Coding.