2012-01-31 2 views
1

У меня есть два UITableview. На первом показан 3 раздела с 3 строками, один по умолчанию. Когда пользователь нажимает строку 2 раздела 0, отображается второе представление для выбора значения. После того, как значение выбрано, оно возвращается к первому виду, но на этот раз с другим макетом. В зависимости от выбранного значения в первом представлении может отображаться только один, два или три раздела. Я пытаюсь добиться такого поведения, передавая индексный путь из дочернего представления в его родительский элемент и динамически меняя количество разделов. Я получаю число строк, выбранных в дочернем представлении, но как только оно передается родительскому представлению, номера строк становятся равными нулю.Перемещение строки индексного пути в родительский вид

Код для зрения ребенка является:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
      [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
      NSUInteger row = indexPath.row; 
      //Create parent view instance to pass back indexpath as a integer 
      DiarioA *plc = [[DiarioA alloc] init]; 
      NSInteger i1 = row; 
      plc.rowTipo = i1; 
      [plc release]; 
      [self.navigationController popViewControllerAnimated:YES]; 
} 
Pa 

вид RET (DiarioA.h)

@property (nonatomic, assign) int rowTipo; 

вид Родитель (Diario.m)

@synthesize rowTipo; 

- (void)viewWillAppear:(BOOL)animated{ 
     [self.tableView reloadData]; 
     //Check if rowTipo has value 
     NSLog(@"RowTipo: %d",rowTipo); 
    } 

//Use rowTipo to dynamically adjust uitableview layout. 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
     if (self.rowTipo==0) { 
      return 3; 
     } 
     return self.rowTipo; 
    } 

Не могли бы вы мне помочь чтобы указать, почему я теряю индексный путь, исходящий из childview в parentview. Ваша помощь очень ценится.

ответ

3

DiarioA *plc = [[DiarioA alloc] init]; Здесь вы создаете новый объект, и установка plc.rowTipo = i1; изменяет значение этого объекта не на родительский объект. Либо вы передаете родительский объект дочернему контроллеру, а затем измените его значение следующим образом.

// child .h file 

DiarioA *plc; 
@property (nonatomic, assign) DiarioA *plc; 

//child .m file 
@synthesize plc; 

// code when you push your child controller 
ChildController *controller = [[ChildController allo] initWithNibName.....]; 
controller.plc = self 

и

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
      [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
      NSUInteger row = indexPath.row; 
      plc.rowTipo = row; 
      [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

Inder, спасибо. Теперь он отлично работает. Вы предпочитаете это вместо делегатов? или оба они равны по эффективности. Кстати, я прошу проголосовать, потому что мои баллы, однако, ваш ответ мне очень помог. – Memo

+0

Плохо, если вы еще не голосовали :( Anyways .. это то же самое, что и delgates .. здесь мы просто передали объект и называемый метод setter, такой же, как delgates ... просто измените вашу переменную .h в 'id delegate;' и вызовите setter на ней '[delegate setRowTipo: row];' тогда это будет похоже на делегирование, хотя оба они одинаковы .. теперь ясно, что вы можете принять его и перенести его;) –

+0

Большое спасибо за ваше время. Мне нужно, по крайней мере, 15 баллов для голосования, однако, ваш ответ полностью принят, и это я искал. Голосование +2 – Memo

2

Я думаю, что вы должны сделать протокол своего контроллера просмотра child и сделать свой родительский контроллер просмотра своим делегатом. Затем просто установите свойство делегирования после инициализации контроллера дочернего представления и вызовите метод делегата, отправляющий туда индексный путь.

+0

Роман, спасибо. Существует ли другая альтернатива вместо методов делегирования? Насколько я понимаю, я пытаюсь упростить код. – Memo

+1

@Memo. Что предлагает Рим, это единственное правильное решение в этой ситуации. Это ** упростит ваш код. – lawicko

+1

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

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