1

У меня есть tableView, из которого я перехожу к «viewController», то есть PassengerInfoViewController, в котором у меня есть форма. Заполните форму, сделайте из нее dictionary и добавьте ее в NSMutableArray.Как заполнить массив из detailViewController и вернуться к masterViewController в iOS?

Итак, когда я возвращаюсь к таблице tableView' I would like to pass this array and then reload the tableView` с заполненным массивом.

Так вот, что я делаю: -

//navigate to the form 
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    PassengerInfoViewController *pivc = [self.storyboard instantiateViewControllerWithIdentifier:@"PassengerInfoViewController"]; 
    [self.navigationController pushViewController:pivc animated:YES]; 

} 

//After filling up the form 

-(void)goBackToPassengerDetails:(UIButton*)sender{ 

    NSString *title = self.titleTextField.text; 
    NSString *fname = self.firstNameTextField.text; 
    NSString *lname =self.lastNameTextField.text; 
    NSString *ageStr = self.ageTextField.text; 

    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 
    [dict setValue:title forKey:@"title"]; 
    [dict setValue:fname forKey:@"firstName"]; 
    [dict setValue:lname forKey:@"lastName"]; 
    [dict setValue:ageStr forKey:@"age"]; 
    Passenger *passengerObj = [Passenger sharedInstance]; //Singleton 

    [passengerObj.passengerDetailArray addObject:dict]; 

    PassengerDetailsViewController *pdc = [self.storyboard instantiateViewControllerWithIdentifier:@"PassengerDetailsViewController"]; 
[pdc getPassengerinfo:passengerObj.passengerDetailArray]; 
[self.navigationController popViewControllerAnimated:YES]; 

После того, как я вернуться обратно я перезагрузить таблицу view.However celForRow метод не заселить новые значения.

-(void)getPassengerinfo:(NSMutableArray*)arr{ 
    passenger_infoArray =[[NSMutableArray alloc]init]; 
    passenger_infoArray = arr; 
    NSLog(@"Passenger Info Array : %@", passenger_infoArray);//Shows array of dictionaries 

    [passengerInfoTableView reloadData]; 
} 

Мой cellForRow метод выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Not called when I am doing reload data 
    static NSString *CellIdentifier = @"Cell"; 
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier ]; 

    } 
    NSLog(@"Table view array : %@",passenger_infoArray); 
    if (passenger_infoArray.count>0) { 

    NSString *temp= [[passenger_infoArray objectAtIndex:indexPath.row]objectForKey:@"firstName"]; 
    cell.textLabel.text = temp; 
    }else{ 

    cell.textLabel.text = [NSString stringWithFormat:@"Passenger %ld", (long)indexPath.row+1]; 
    cell.imageView.image = [UIImage imageNamed:@"user.png"]; 

    } 
    return cell; 

    } 

ответ

0

Вы можете передавать данные предыдущего контроллера представления, используя метод делегата

В PassengerInfoViewController.h добавить ниже код чуть выше вашей import заявление

@protocol passengerInfoViewControllerdelegate <NSObject> 
    -(void)sendData:(NSMutableArray *)arrData; 
@end 

После этого создать одно свойство, как показано ниже

@property(nonatomic,assign)id delegate; 

Сейчас в PassengerInfoViewController.m синтезировать свойства и после этого

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [delegate sendData:yourArray]; 
} 

tableview Сейчас в

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    PassengerInfoViewController *pivc = [self.storyboard instantiateViewControllerWithIdentifier:@"PassengerInfoViewController"]; 

    pivc.delegate = self; //Add this line to your code 

    [self.navigationController pushViewController:pivc animated:YES]; 
} 

сейчас , пришло время реализовать метод делегирования, который мы создали в viewcontroller

-(void)sendData:(NSMutableArray *)arrData 
{ 
     passenger_infoArray = arrData; 
    [passengerInfoTableView reloadData]; 
} 
+0

Ну, причина, по которой я использовал одноэлементный массив, заключалась в том, что я хотел сохранить предыдущие значения, т. Е. Если бы я добавил словарь к нему ранее. Я просто хочу добавить новый словарь в массив. – iSD

+0

, тогда в этом случае вы должны сохранить предыдущий массив либо в prefrence, либо в базе данных – Indrajeet

+0

Я получаю массив, когда возвращаюсь сейчас. Но даже после вызова reloadData в представлении таблицы строка cellFor не читает код, в котором я его заполняю из массива. Любая идея, почему? См. мой обновленный вопрос. – iSD

1

Вы можете передать данные с помощью

  1. Делегаты
  2. Уведомления
  3. Свойства
  4. Глобальные переменные

Использование делегатов хорошая практика, и последние два не являются предпочтительными ,

0

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

Как только ваша форма будет завершена, ваш PDC должен позвонить [self performSegue:@"theNameOfTheUnwindSegueeYouCreateInTheStoryboard"]. Затем в вашем методе PDC prepareForSegue получите свойство destinationViewController из параметра storyboardSegue - это ваш VC, содержащий представление таблицы. Установите любое свойство модели, которое вы используете, чтобы вернуть представление таблицы - в вашем случае это будет объект passenger_infoArray, который вам нужно будет сделать mutable, если он еще не установлен, а также публично публиковать, если он еще не был.

+0

Я получаю массив, когда возвращаюсь из «travelInfoVC» с предварительно выделенными значениями. Но даже после вызова reloadData мой метод cellForRow не вызывается. – iSD

+0

В описанном мной сценарии вы хотите вызвать reloadData при использовании методов viewWillAppear или viewDidAppear. Попробуйте установить контрольные точки, чтобы увидеть, когда они вызываются. – bpapa

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