Подтвердить что ты не робот

Переход к детальному представлению из ячейки таблицы со списком с помощью Xcode Storyboard

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

Вот мой код. Что мне не хватает, чтобы выполнить segue из представления таблицы в подробные представления? Код:

.h 

@interface DetailViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>  
{ 
    IBOutlet UITableView *myTable;
    NSMutableArray *contentArray;
}

@property (strong, nonatomic) IBOutlet UITableView *myTable;

.m


- (void)viewDidLoad 
{
    contentArray = [[NSMutableArray alloc]init];
    [contentArray addObject:@"Espresso"];
    [contentArray addObject:@"Latte"];
    [contentArray addObject:@"Capicino"];
    [super viewDidLoad];
     // Do any additional setup after loading the view.
}

//Table Information
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [contentArray count];
}

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

     [tableView deselectRowAtIndexPath:indexPath animated:YES];

     if([[contentArray objectAtIndex:indexPath.row]isEqualToString:@"EspressoViewController"])
     {
         EspressoViewController *espresso = [[EspressoViewController alloc]initWithNibName:@"EspressoViewController" bundle:nil];  
         [self.navigationController pushViewController:espresso animated:YES];
     }
     else if ([[contentArray objectAtIndex:indexPath.row] isEqualToString:@"Latte"])
     {
         LatteViewController *latte = [[LatteViewController alloc] initWithNibName:@"Latte" bundle:nil];
         [self.navigationController pushViewController:latte animated:YES];
     }

}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{
    [self tableView:tableView didSelectRowAtIndexPath:indexPath];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CellIdentifier"];
    }

    NSString *cellValue = [contentArray objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.font = [UIFont systemFontOfSize:16];
    cell.detailTextLabel.text = @"Hot and ready";

    UIImage *image = [UIImage imageNamed:@"coffeeButton.png"];
    cell.imageView.image = image;

    cell.textLabel.text = [contentArray objectAtIndex:indexPath.row];
    return cell;
}
4b9b3361

Ответ 1

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

Во-первых, отправив tableView:didSelectRowAtIndexPath: из tableView:accessoryButtonTappedForRowAtIndexPath:, нет никакой разницы между этими двумя методами. Нажатие на ячейку или ее вспомогательная кнопка выполняет одно и то же действие. Если вам не нужна кнопка аксессуара для выполнения другого действия, кроме нажатия самой ячейки, удалите ее.

Во-вторых, если вы используете раскадровку, вам не нужно выделять /initWithNib для ваших контроллеров представлений. Вместо этого используйте segue. Если вы делаете это через раскадровку, вам также не нужно программно нажимать viewControllers на ваш navigationController

Сначала создайте раскадровку:

  • Вытащите UITableViewController. Убедитесь, что вы установили класс UITableViewController, который вы перетащили на свой собственный "DetailViewController", используя панель инспектора с правой стороны.
  • Затем выберите этот контроллер и с помощью меню выберите " Редактор Вставить Контроллер навигации".
  • Затем перетащите три общих UIViewControllers. Установите класс один в "LatteViewController", другой - "EspressoViewController", а третий - "CapicinoViewController" (снова с помощью инспектора).
  • Управляйте + перетаскиванием из UITableViewController на каждый из этих viewControllers и выберите PUSH.
  • Нажмите на маленький круг, который находится на стрелке между вашим UITableViewController и каждым из этих viewControllers. В инспекторе (справа) дайте каждому segue уникальное имя в поле Идентификатор. Вам нужно будет запомнить это имя для своего кода. Я бы назвал их "EspressoSegue", "LatteSegue" и "CapicinoSegue". Вы увидите, почему в коде ниже.

Затем поместите следующий код в свой UITableViewController:

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

//Build a segue string based on the selected cell
NSString *segueString = [NSString stringWithFormat:@"%@Segue",
                        [contentArray objectAtIndex:indexPath.row]];
//Since contentArray is an array of strings, we can use it to build a unique 
//identifier for each segue.

//Perform a segue.
[self performSegueWithIdentifier:segueString
                          sender:[contentArray objectAtIndex:indexPath.row]];
}

Как вы реализуете все остальное зависит от вас. Вы можете реализовать prepareForSegue:sender: в своем UITableViewController, а затем использовать этот метод для отправки информации на segue.destinationViewController.

Обратите внимание, что я передал строку из вашего contentArray в качестве отправителя для segue. Вы можете передать все, что захотите. Строка, которая идентифицирует ячейку, кажется, что наиболее логичная информация проходит, но выбор зависит от вас.

Приведенный выше код должен выполнить навигацию для вас.