2013-02-11 2 views
0

У меня есть контроллер навигации, встроенный в RootViewController. Элементы, присутствующие внутри RootViewController, представляют собой сегментированный элемент управления и UIView. Когда выбраны разные сегменты, UIView отображает соответствующий ViewController.Как сделать pushViewController: работать в следующем случае?

Теперь каждый из ViewController, отображаемый в UIView, является UITableViewController.

Мне нужно отобразить значения таблиц в соответствии с выборами сегмента. А также, если выбран какой-либо из строк таблицы, он должен перейти к более новому ViewController с подробным представлением.

Я могу отображать UITableViewControllers в соответствии с изменением сегмента. Однако, когда я нажимаю на строку таблицы, новый ViewController, который появляется, пуст (черный экран), хотя я создал конкретный ViewController в раскадровке и также установил идентификатор.

Код для изменения сегментированных управлений в ViewController.m

- (void)segmentedControlChangedValue:(UISegmentedControl*)segmentedControl { 

int selIndex = segmentedControl.selectedIndex; 

if (selIndex == 0) 
{ 
    aTable = [[aTableViewController alloc] init]; 

    aTable.view.frame = self.myView.bounds; 
    [self.myView addSubview:aTable.view]; 
    [self addChildViewController:aTable]; 
} 

if (selIndex == 1) 
{ 
    bTable = [[bTableViewController alloc] init]; 

    bTable.view.frame = self.myView.bounds; 
    [self.myView addSubview:bTable.view]; 
    [self addChildViewController:bTable]; 

} 

if (selIndex == 2) 
{ 
    //NSLog (@"Well you selected a 3rd option"); 
}} 

Код для didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
[super tableView:tableView didSelectRowAtIndexPath:indexPath]; 

newDetailController* newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Detail"]; 

newController = [[newDetailController alloc] init]; 

[[self navigationController] pushViewController:newController animated:YES];} 

pushViewController выталкивает пустой взгляд для меня, хотя я указал ViewController для использования в дизайне раскадровки, а также с использованием идентификатора.

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

ОБНОВЛЕНИЕ - Проблема была решена.

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

я передать данные в newViewController следующим образом:

  1. Создать класс с именем NewClass, который содержит все элементы, которые я хочу, чтобы пройти через.

  2. Создайте «newObjects» NSMutableArray в firstViewController.

  3. Создайте каждый объект newClass при этом методе.

    • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {

    static NSString *CellIdentifier = @"Cell";

    customBigTableCell *cell = (customBigTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) { cell = [[customBigTableCell alloc] init]; }

    cell.name.text = [object objectForKey:@"objName"];

    newClass* newObj = [[newClass alloc] init];

    newObj.objName = cell.name.text;

    [newObjects addObject:newObj];

    return cell; } Pls pardon me .. для отступов с кодовым блоком перепутано ... Также PFObject - это то, что я использую Parse для базы данных.

  4. Добавить созданный объект в массив newObjects.

  5. В методе - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath, это код

    • (пустоты) Tableview: (UITableView *) Tableview didSelectRowAtIndexPath: (NSIndexPath *) indexPath { [супер Tableview: Tableview didSelectRowAtIndexPath: indexPath];

      UIStoryboard * раскадровка = [UIStoryboard раскадровкаWithName: @ "MainStoryboard" комплект: [NSBundle mainBundle]];

      новыйDetailController * новыйController = [раскадровка instantiateViewControllerWithIdentifier: @ "ПредстоящийDetail"];

      obj = [[newClass alloc] init];

      NSIndexPath * path = [self.tableView indexPathForSelectedRow];

      obj = [newObjects objectAtIndex: path.row];

      NSLog (@ "Row selected is% ld", (long) path.row); // это возвращает правильную строку, выбранную

      NSLog (@ "Movie selected is% @", [[newObjects objectAtIndex: path.row] objName]); // однако это неверно по методу cellForRowAtIndexPath ,

      [новыйController setNewObj: obj];

      [[self navigationController] pushViewController: newController animated: YES]; }

При запуске этого кода, строка выбрана правильно. Однако я не получаю соответствующую строку в базе данных. Массив хранится с избыточными данными.

ответ

1

Вам нужно избавиться от этой средней линии:

newController = [[newDetailController alloc] init]; 

Это просто переопределяет newController (как пустой контроллер, без зрения настроить), который вы определили в первой строке.

+0

Спасибо @rdelmar. Однако, когда я удаляю этот оператор, я получаю следующую ошибку ... Приложение попыталось нажать на контроллер представления nil на цель AJoseph

+0

Кроме того, я проверил аналогичные вопросы, и они попросили меня не переопределять - (void) loadView. Тем не менее, у меня нет этого метода, переопределенного в моей программе. – AJoseph

+0

@AJoseph, если вы получаете эту ошибку, то по какой-то причине строка выше не возвращает контроллер вида. Вы должны зарегистрировать как newController, так и self.storyboard, чтобы узнать, что равно нулю. Кроме того, вы, вероятно, не должны переопределять loadView - почему вы это делаете? – rdelmar