2013-05-09 4 views
1

Я полностью потерял эту проблему. Я работал с раскадными досками, я создал навигационный контроллер с табличными представлениями и некоторыми материалами. В каждой строке таблицы есть Services, и мне нужно создать один подробный вид для каждой службы.Раскадровки и программные представления

Есть много услуг, поэтому я не могу создать их в раскадровке. Идея состоит в том, чтобы загрузить Services из webservice (количество параметров, типы каждого из них и т. Д.) И добавить как текстовые поля/кнопки, соответствующие Service.

Итак, мои проблемы и вопросы:

1) Могу ли я комбинировать раскадровки и виды программно? Когда я создаю NewView в MyTableviewClass, должен ли я сделать это в моем методе prepareforsegue? Как я могу показать его на экране без потери моего контроллера навигации? это то, что у меня есть (это не работает: он говорит мне, что нет с названием Segue «Service1»):

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 

if ([[segue identifier] isEqualToString:@"NextLevel"]) { 
    [segue.destinationViewController setActualNodo:[actualNodo getSonAtIndex:indexPath.row]]; 
} else if ([[segue identifier] isEqualToString:@"Service1"]) { 
    CGRect bounds = self.view.bounds; 
    UIView *myview = [[UIView alloc] initWithFrame:bounds]; 
    [myview setBackgroundColor: [UIColor redColor]]; 
    [self.view addSubview:myview]; 
    [self.view bringSubviewToFront:myview]; } 

любой книги или ссылки приветствуется, но я не мог найти ничего подобного. Это очень сложно в iOS? Я сделал аналогичную вещь на Java. Я читал о динамическом создании интерфейсов с XIB, но, искренне, я не знаю, что это такое. Спасибо за все.

ответ

2

Да, вы можете создать StoryBoard с представлением, а затем добавить к нему программные варианты.

Вы не должны пытаться создать представление в своем методе prepareForSegue. Это действительно должно использоваться для передачи объектов другому ViewController.

Я бы предложил это вам. Вернитесь к своему StoryBoard и создайте новую сцену UIViewController. Нажмите на свою первую сцену, и CTRL перетащите на новую сцену. Затем нажмите на свой сегмент и дайте ему имя.

Шаг 1:

Создать новый класс ServicesViewController и убедитесь, что это подкласс `UIViewController:

**enter image description here**

Шаг 2:

Go вернитесь к своему StoryBoard и нажмите на сцену так что он выбран. Затем нажмите на Files Owner и, наконец, нажмите кнопку информации о классе (третья кнопка) и, наконец, выберите свой класс ServiceViewController, который вы только что создали.

enter image description here

Шаг 3:

обратно в ServicesViewController в методе didSelectRowAtIndex обратитесь к seque:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"YOUR_SEGUE_NAME" sender:nil]; 
} 

сейчас, вычистить весь код в методе prepareForSegue и просто сначала сделайте переход вниз.

+0

Сначала спасибо за ваш ответ. Итак, я мог бы создать новый ViewController (пустой) в своем раскадровке, связать его с моим классом «ServiceView» и программным образом создать интерфейс в ViewDidLoad, правильно? – Sergiodiaz53

+0

Я обновил свой ответ более подробно. Надеюсь, это поможет вам больше! Не обращайте внимания на UImageView на сцене, это один из моего проекта. Это должен быть пустой белый вид на вашем. – Flea

+0

Как насчет добавления кнопок программно на UIButton нажмите на просмотр раскадровки? –

1

Похоже, вы просто имеете несколько ячеек в таблицеView. Вместо использования segues вы можете просто создавать разные ячейки с разными идентификаторами и показывать или скрывать их на основе того, какие службы обнаруживаются в вашем массиве служб, который заполняется из вашего веб-сервиса.

+0

Благодарим вас за помощь, MarkM, но моя проблема заключается в том, как я мог бы генерировать интерфейс динамически, как только у меня будет рабочий стол. В любом случае, я думаю, что я могу продолжать работать с верхним ответом. – Sergiodiaz53

2

В дополнение к ответу Блошины, если вам нужно сохранить контроллер навигации, просто создайте push-сегу в своем раскадровке, перетащив управление из значка владельца файла (желтое поле под вашим представлением контроллера) контроллера табличного представления к ServiceViewController, который вы добавили в раскадровку, это должно показать всплывающее окно, в котором вы можете выбрать «push» как тип segue. Затем выберите сегмент и инспектор атрибутов (четвертая кнопка, рядом с снимком в снимке) и в текстовом поле «Идентификатор» введите уникальный идентификатор для вашего сеанса, например serviceSegue.

На данный момент, используя код блохи:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"serviceSegue" sender:nil]; 
} 

А в коде вы публикуемый:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 

    if ([[segue identifier] isEqualToString:@"serviceSegue"]) 
     [segue.destinationViewController setActualNodo:[actualNodo getSonAtIndex:indexPath.row]]; 
} 

Я не уверен, что вы пытаетесь сделать с другой Segue «Service1 », но если вы хотите изменить представление TableViewController, segues - это не способ сделать это. Если все, что вы должны сделать это в методе didSelectRowAtIndexPath в зависимости от выбираемой строки:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (You want to transition to other view controller) 
     [self performSegueWithIdentifier:@"serviceSegue" sender:nil]; 
    else 
     Change your view here. 
} 

Я надеюсь, что это поможет!

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