2012-04-30 3 views
0

Я новичок в разработке iphone с объективом C и XCode 4.2. В настоящий момент я успешно создал экземпляр UITableViewController и может пересекать многоуровневое дерево данных json. однако, у меня возникли проблемы с установкой пользовательского интерфейса для листовой страницы. Позвольте мне показать вам фрагмент кода до сих пор:iphone uiviewcontroller не отображается?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
     int row = [indexPath row]; 
     NSString * currentrow = [NSString stringWithFormat:@"%d.",row]; 


     NSDictionary * item = [dataArray objectForKey:currentrow]; 
     NSDictionary * children = [item objectForKey:@"children"]; 
     if(children != nil) 
     { 
      uinavTableViewController *childView = [[uinavTableViewController alloc] init]; 
      childView.dataArray = children; 
      [self.navigationController pushViewController:childView animated:YES]; 
     } 
     else 
     { 
      uinavMenuItem * childView = [[uinavMenuItem alloc] init]; 
      //uinavSecondViewController * childView = [[uinavSecondViewController alloc] init]; 
      [self.navigationController pushViewController:childView animated:YES]; 
     } 
} 

Так первая часть, если заявление будет проверять, есть дочерние узлы, если да создать еще один uinavTableViewController. Эта часть работает отлично.

Оператор else создает страницу листа с помощью uinavMenuItem. Когда я запускаю это в симуляторе, листовая страница - это просто черный экран. Я посмотрел в своем NSLog и могу подтвердить, что uinavMenuItem viewDidLoad действительно уволили. Таким образом, код контроллера работает нормально, но я просто не знаю, как подключиться к представлению, которое я рисовал в раскадровке.

Что я делаю неправильно, что не позволяет uinavMenuItem отображать то, что я нарисовал в storyboarD?

ответ

2

Если вы хотите запустить контроллер просмотра, который вы сделали в раскадровке, используйте UIStoryboard's -instantiateViewControllerWithIdentifier. Вы определяете этот идентификатор в раскадровке под свойствами контроллера представления. Ваше представление загружено, но пустое, потому что оно не загружает то, что у вас есть в раскадровке. Вероятно, он вызывает -loadView, потому что он не может его найти.

Вот где вы вводите идентификатор:

Enter the identifier here

+0

Спасибо, можете ли вы уточнить «определить идентификатор в раскадровке под свойствами контроллера представления»? Я смотрю вокруг панелей Xcode, но не могу точно определить что-то такое, как instantiateViewContollerWithIdentifier – John

+0

добавлено изображение для ясности. – Morrowless

+0

Хорошо, я сделал идентификатор. то я заменил свое заявление else следующим: 'uinavMenuItem * childView = [self.storyboard instantiateViewControllerWithIdentifier: @" menuleafsegue "]; [self.navigationController pushViewController: childView animated: YES]; 'Есть ли строка в правой строке? Прямо сейчас симулятор не подходит к моему uinavMenuItem. – John

0

Если вы используете раскадровку, проще просто создать segue из UITableViewController для листового контроллера. Это можно сделать, щелкнув контроллер табличного представления, а затем перетащив push-сег в листовой контроллер. Внутри боковой панели X-Code укажите сегмент и идентификатор.

Затем в коде, вместо вызова [self.navigationController pushViewController] вы можете использовать:

if(children != nil) 
{ 
    [self performSegueWithIdentifier: @"YourIdentifierHere" sender: self]; 
} 
else 
{ 
    [self [performSegueWithIdentifier: @"TheOtherIdentifier" sender: self]; 
} 

Чтобы передать данные uinavTableViewController, вы используете метод prepareForSegue в том же контроллере, который выполняет SEGUE:

- (void)prepareForSegue: (UIStoryboardSegue *)segue sender: (id)sender 
{ 
    // Because you have two segues, you need to check the identifier 
    if ([[segue identifier] isEqualToString: @"YourIdentifierHere"]) 
    { 
     uinavTableViewController childView = (uinavTableViewController *)segue.destinationViewController; 
     childView.dataArray = children; 
    } 
} 
+0

спасибо, я не могу понять МЕТОДИЧЕСКИЕ дать SEGUE идентификатор. Я попробовал ctrl + щелкнуть несколько thigns на правой боковой панели xcode, но я не заметил ничего, что явно связано с идентификаторами segue. – John

+0

Сначала щелкните правой кнопкой мыши ваш контроллер табличного представления, а затем в разделе «Storyboard Segues» перетащите круг рядом с надписью " Нажмите «на листовой контроллер». Раскадровка создаст стрелку между контроллерами (это будет segue). Нажмите стрелку (или значок в середине стрелки) и откройте инспектор атрибутов (правая боковая панель XCode, четвертая вкладка слева, выглядит как пряжка ремня), а затем отредактируйте «Идентификатор». –

+0

спасибо. Теперь, когда я запускаю симулятор, я получаю ошибку SIGABRT. Так что, я думаю, это ошибка памяти или я не создавал somethign правильно? – John