PresentModalViewController Проблема!

So,

У меня есть форма (которая по сути является UITableView), и как только я закончу ее, я нажимаю кнопку «Готово», которая находится в верхней части экрана.

После щелчка мне нужно добавить данные в другой tableView (который находится в другом tableViewController). Эта таблица также находится внутри контроллера навигации.

После того, как я нажму кнопку «Готово», мне нужно, чтобы PresentModalViewController был новым TableView (с новыми данными) вместе с контроллером навигации поверх tableView.

Итак, подведем итог:

  • Кнопка «Готово» находится в someTableViewController.
  • Мне нужно добавить объект (для простоты я добавляю имя «Добби») в другой tableView с именем dogTableViewController.
  • Я перезагружаю данные и представляю экран с dogTableViewController внутри dogNavigationController.
  • Все классы правильно указаны и включены.

Я вставляю - (IBAction) при нажатии кнопки «Готово».

-(IBAction) doneWithData: (UIBarButtonItem*) sender{


 UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
[indicator sizeToFit];
indicator.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                              UIViewAutoresizingFlexibleRightMargin |
                              UIViewAutoresizingFlexibleTopMargin |
                              UIViewAutoresizingFlexibleBottomMargin);

indicator.tag = 1;
[self.view addSubview:indicator];
[indicator setBackgroundColor:[UIColor clearColor]];
indicator.center = self.view.center;
indicator.hidden = FALSE;
[indicator startAnimating];

if (self.dogTableViewController == nil)
{
    DogTableViewController *temp = [[DogTableViewController alloc] init];
    self.dogTableViewController = temp;
    [temp release];
}

if (self.dogNavigationController == nil)
{
    DogNavigationController *temp = [[DogNavigationController alloc] init];
    self.dogNavigationController = temp;
    [temp release];
}

[self.dogTableViewController.dogArray addObject:@"Dobby"];
[self.dogTableViewController.tableView reloadData];

NSLog (@"%@", [self.dogTableViewController.dogArray objectAtIndex:0]); 
//Prints out "Null" //

[self presentModalViewController:dogNavigationController animated:YES];


[indicator release];

}

Когда я все это сделаю и нажму кнопку "Готово",

Я получаю пустой экран навигации без ТАБЛИЦЫ. Плюс у меня также было несколько кнопок на экране dogNavigationController. Ничего не видно !!

Моя цель - просто перенести экран на этот новый экран (который является домашним экраном, а не rootController). Как вы думаете, мне следует использовать modalViewController для этой задачи? Как вы думаете, мне следует использовать другой способ переноса данных на другой экран?

p.s. Я не хочу использовать PushViewController.


comment
Домашний экран? Разве ты не должен тогда появиться?   -  person Deepak Danduprolu    schedule 08.06.2011
comment
Вот как работает приложение ... 1 - ›2 -› 3- ›4-› 1   -  person Legolas    schedule 08.06.2011
comment
Я нажимаю кнопку «Готово» в 4, и мне нужно 1 для отображения с добавленными данными.   -  person Legolas    schedule 08.06.2011


Ответы (1)


Я думаю тебе стоит сделать

[self.navigationController popToRootViewControllerAnimated:YES];

скорее. Чтобы получить контроллер корневого представления, вы можете:

DogTableViewController * viewController = [self.navigationController.viewControllers objectAtIndex:0];
[viewController.dogArray addObject:aDog];

Исходный ответ

Разве вы не должны инициализировать контроллер навигации с помощью корневого контроллера представления?

DogNavigationController *temp = [[DogNavigationController alloc] initWithRootViewController:self.dogTableViewController];
person Deepak Danduprolu    schedule 08.06.2011
comment
RootController - это TabBarController - person Legolas; 08.06.2011
comment
Поэтому я изменил код, как вы написали выше. Теперь я вижу правильный заголовок dogNavigationController. Я не вижу ни одного UIBarButtonItem, и не вижу tableView. - person Legolas; 08.06.2011
comment
popToRootViewController сделал свое дело, и теперь я нахожусь в dogNavigationController. Спасибо чувак. НО ; объект не добавляется к нему !! ..... и таблица нулевая. - person Legolas; 08.06.2011
comment
DogTableViewController * viewController = [self.navigationController.viewControllers objectAtIndex: 0]; [viewController.dogArray addObject: @Dobby]; [viewController.tableView reloadData]; [self.dogTableViewController.dogArray addObject: @Dobby]; [self.dogTableViewController.tableView reloadData]; NSLog (@% @, [self.dogTableViewController.dogArray objectAtIndex: 0]); NSLog (@% @, [viewController.dogArray objectAtIndex: 0]); - person Legolas; 08.06.2011
comment
поместите оператор [self.tableView reloadData]; в viewWillAppear метод DogTableViewController. Как вы устанавливаете свойство self.dogTableViewController? Таким образом, вы инициализировали массив? Это может быть nil без инициализации, что даст вам null результат. - person Deepak Danduprolu; 08.06.2011
comment
Ух ты. Я его вообще не инициализировал. Теперь я перешел к init-методу и инициализировал его. Теперь мои NSLogs изменились на Dobby и NULL - person Legolas; 08.06.2011
comment
По-прежнему я не вижу объект, добавленный Добби в tableView. - person Legolas; 08.06.2011
comment
self.dogTableViewController тоже должно быть nil. Вы добавляли [self.tableView reloadData]; к методу viewWillAppear? Вам также следует попробовать записать dogArray туда. - person Deepak Danduprolu; 08.06.2011
comment
Ух ты. Он отображает NULL в viewWillAppear - person Legolas; 08.06.2011
comment
Вы должны инициализировать свойство dogArray в viewDidLoad из DogTableViewController. - person Deepak Danduprolu; 08.06.2011
comment
Итак, я также инициализировал свойство dogarray в ViewDidLoad ... Теперь приложение вылетает, когда я нажимаю кнопку DOne, и ошибка связана с NSLogs. (если я закомментирую NSLogs, ошибки нет; но объект тоже не добавляется). Я вставляю ошибку ниже. *** Завершение работы приложения из-за неперехваченного исключения «NSRangeException», причина: «*** - [__ NSArrayM objectAtIndex:]: индекс 0 за пределами границ для пустого массива» - person Legolas; 08.06.2011
comment
Как вы инициализируете массив? - person Deepak Danduprolu; 08.06.2011
comment
Нравится. NSMutableArray * array = [[NSMutableArray alloc] init]; self.dogArray = массив; [выпуск массива]; - person Legolas; 08.06.2011
comment
Привет, Дипак ... Есть шансы, что ты зайдёшь в чат? - person Legolas; 08.06.2011
comment
Конечно. Я присоединился к iPhone / iPad - person Deepak Danduprolu; 08.06.2011
comment
[[NSNotificationCenter defaultCenter] postNotification: @UserDidAddDogNotification object: self userInfo: info]; - person Legolas; 09.06.2011
comment
*** Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [NSNotificationCenter postNotification: object: userInfo:]: нераспознанный селектор отправлен в экземпляр 0x6811200' *** Стек вызовов первого вызова: - person Legolas; 09.06.2011
comment
Не могу сказать без дополнительных данных. Here - это образец проекта, который выполняет то же самое, что мы обсуждали вчера. Надеюсь, это поможет вам выяснить, в чем была ошибка. - person Deepak Danduprolu; 09.06.2011
comment
Вещи работают. Исправлена ​​ошибка, все работает ... Это были изменения. // NSDictionary * info = [уведомление userInfo]; // NSString * dogName = [info stringForKey: @dogName]; NSString * dogName = [[userInfo уведомления] objectForKey: @dogName]; ......... и другая ошибка была postNotification вместо postNotificationName. - person Legolas; 09.06.2011
comment
@Deepak: Могу ли я добавить много наблюдателей во многие контроллеры представления, чтобы они также получали информацию о пользователе? И должен ли я реализовать DidAddDog для всех этих классов? - person Legolas; 09.06.2011
comment
Да, ты можешь. Имя метода может быть любым, но вам придется реализовать его для всех этих классов. Одна вещь, которую я, возможно, не сделал в этом примере, - это то, что вы должны удалить себя в качестве наблюдателя в методе dealloc, иначе это приведет к ошибке, когда центр уведомлений отправит сообщение об освобожденном объекте. - person Deepak Danduprolu; 09.06.2011
comment
в освобождении ... [[NSNotificationCenter defaultCenter] removeObserver: self]; ? - person Legolas; 09.06.2011