IOS StoryBoard несколько Segue от TableCell - PullRequest
47 голосов
/ 12 января 2012

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

Я думал, что у меня будет два перехода от клетки, каждый из которых указывает на отдельный вид, а затем вызову желаемый переход:

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

    NSInteger row = indexPath.row;
    NSLog(@"Selected Item :-) %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:row]]);
    if(row %2 ==0){
        NSLog(@"Even");        
        [self performSegueWithIdentifier:@"ShowSecondIndex" sender:self];
    }else{
        [self performSegueWithIdentifier:@"ShowSelectedMovie" sender:self];
        NSLog(@"Odd");

    }

} 

Я бы тогда обработал переход в prepareForSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    NSLog(@"Prepare For Segue ID:%@",[segue identifier]);

    if([[segue identifier] isEqualToString:@"ShowSelectedMovie"]){
        Tab2_ItemViewController *vc = [segue destinationViewController];
        NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
        NSLog(@"Selected Index: %d",selectedIndex);
        [vc setSelectedItem: [NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]];
        NSLog(@"String Value: %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]);
        [vc setSelectedIndex:selectedIndex];


    }else if([[segue identifier] isEqualToString:@"ShowSecondIndex"]){

        NSLog(@"Viewing Second Index");
    }

}

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

Ответы [ 4 ]

66 голосов
/ 12 января 2012

В этом случае не пытайтесь подключить Segues к ячейке просмотра таблицы.Подключите их к самому контроллеру представления.

45 голосов
/ 25 июля 2012

Не пытайтесь создать несколько сегментов из TableCell в другие контроллеры представления, вы хотите, чтобы ctrl + перетаскивал значок контроллера представления под контроллером представления в интерфейсе раскадровки к контроллерам представления, к которым вы хотите перейти.Тогда это позволит вам настроить несколько сегментов.

screenshot showing multiple segues

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

giving segue an identifier

затем, для примера TableCells, в вашем UITableViewDelegate, в

-tableView:didSelectRowAtIndexPath: 

вы можете использовать

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

чтобы вручную запустить переход, в зависимости от вашей собственной логики того, какой переход следует выбрать.

4 голосов
/ 13 сентября 2013

Вот пример кода из моего демонстрационного проекта:

-         (void)tableView:(UITableView *)tableView
  didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *segueName = nil;

    if (type == kCore) {
        segueName = @"segue1";
    } else if (type == kStdlib) {
        segueName = @"segue2";
    }

    [self performSegueWithIdentifier: segueName sender: self];
}

type - это свойство контроллера представления, которое определяет, какой переход следует выполнить.

Как сказано выше, ключ заключается в том, чтобы создать переход, связав два контроллера вида.

1 голос
/ 18 мая 2017

В swift 3.1, с сегментным контролем двух состояний

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var segue: String!
if selectedSegment == 0 {
    segue = "segue1"
} else  {
    segue = "segue2"
}
self.performSegue(withIdentifier: segue, sender: self)

}

...