Рассказывают раскадровку iOS с помощью таблицы
-
27-10-2019 - |
Вопрос
Привет, у меня есть раскадровка, и я могу показать подробное представление при нажатии на таблицу. Я хочу добавить дополнительную функциональность, чтобы в зависимости от того, какая ячейка я нажимаю, я показываю другой контроллер представления. Я попытался вытащить два сегэя из одной и той же ячейки, но это не позволяет.
Я думал, что у меня будут два перехода от ячейки, каждый из которых указывал на другой вид, а затем вызовуте желаемый переход:
- (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");
}
}
Затем я бы справился с Segue в 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 от контроллера в каждый пункт назначения, а не по одному из ячейки, и один из контроллера, но не повезло ???
Решение
Не пытайтесь подключить Segues к TableViewCell в этом случае. Подключите их к самому контроллеру.
Другие советы
Не пытайтесь создать несколько сегментов из Tablecell к другим контроллерам представления, вы хотите перетащить CTRL+значок контроллера представления под контроллером представления в интерфейсе раскадровки к ViewControllers, с которыми вы хотите перейти. Тогда это позволит вам настроить несколько сегментов.
А потом, чтобы фактически заставить Segues работать, вам нужно добавить идентификаторы в самих сегей, что вы можете сделать, нажав на них, а затем дав ему имя в инспекторе свойства:
Затем, для примера табличек, в вашем UitableViewDelegate, в
-tableView:didSelectRowAtIndexPath:
вы можете использовать
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
Чтобы вручную начать переход, в зависимости от вашей собственной логики того, что следует выбрать.
Вот пример кода из моего демонстрационного проекта:
- (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
является свойством контроллера представления, которое определяет, какой переход должен быть выполнен.
Как сказал вышеупомянутый ответ, ключ - создать Segue, связывая два контроллера представления.
В 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)
}