Как сделать push-сегмент при выборе UITableViewCell
у меня есть список эффектов в виде таблицы. Я создал верхнюю правую кнопку панели, которая выполняет переход к другому контроллеру вида, который помогает создать новый эффект. Теперь я хочу добавить push-сегменты в ячейки представления таблицы, чтобы значения эффектов могли быть загружены на контроллер представления add effects, и я могу сохранить отредактированные значения.
вопрос в том, Могу ли я создать push segue программно? Если нет, я могу передать эффект через prepareforsegue
? Если я попытаюсь использовать prepareforsegue
, Я бегу в проблему, где управление перетаскиванием из UITableView
не позволяет мне создать push-сегмент для контроллера представления add effects.
10 ответов:
управления перетащите из контроллера вида в контроллер вида
вам нужно будет дать идентификатор для вашего segue:
выполнить переход:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"yourSegue" sender:self]; }
теперь вот что, это просто выполнит сегмент, если вам когда-либо нужно было передать некоторые данные в этот контроллер представления. Затем вы должны реализовать следующий делегат segue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Make sure your segue name in storyboard is the same as this line if ([[segue identifier] isEqualToString:@"yourSegue"]) { //if you need to pass data to the next controller do it here } }
вот еще один вариант, который не требует использования didSelectRowAtIndexPath.
вы просто проводите сегмент в Interface Builder от ячейки прототипа до места назначения.
оттуда вы можете просто:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "AffiliationDetail", let destination = segue.destinationViewController as? AffiliateDetailViewController { if let cell = sender as? UITableViewCell, let indexPath = tableView.indexPathForCell(cell) { var affiliation = affiliations[indexPath.row] destination.affiliation = affiliation } } }
Свифт
этот ответ показывает, как передавать данные и обновляется для Xcode 8 и Swift 3.
вот как настроить этот проект.
- создать проект с
TableView
. Смотрите здесь для простого примера.- добавить второй
ViewController
.- управление перетаскиванием с первого контроллера вида с табличным видом на второй контроллер вида. Выбрать "шоу", как переход тип.
- щелкните сегмент в раскадровке, а затем в имени инспектора атрибутов идентификатор "yourSegue". (Вы можете называть его как угодно, но вам также нужно использовать то же имя в коде.)
- (необязательно) вы можете встроить все в навигационный контроллер, выбрав первый контроллер вида в раскадровке и собираюсь Редактор > Вставить В > Навигационный Контроллер.
код
первый вид контроллера с TableView:
import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // ... // method to run when table view cell is tapped func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // Segue to the second view controller self.performSegue(withIdentifier: "yourSegue", sender: self) } // This function is called before the segue override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // get a reference to the second view controller let secondViewController = segue.destination as! SecondViewController // set a variable in the second view controller with the data to pass secondViewController.receivedData = "hello" } }
Второй Вид-Контроллер
class SecondViewController: UIViewController { @IBOutlet weak var label: UILabel! // This variable will hold the data being passed from the First View Controller var receivedData = "" override func viewDidLoad() { super.viewDidLoad() print(receivedData) } }
более простой пример передачи данных между контроллерами вида см. В разделе ответ.
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"YourPushSegueName" sender:self]; }
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"]; [self.navigationController pushViewController:myVController animated:YES]; }
У вас есть 2 варианта: ctrl+перетащите из ячейки прототипа в новый vc, а затем вы будете переходить из каждой ячейки, и вы должны реализовать prepare for segue.
второй вариант, в didselectrowatindexpath вы можете создать экземпляр вашего нового viewcontroller с помощью self.раскадровка instantiateviewcontrollerwithidentifier..., затем вызовите pushviewcontroller или presentviewcontroller, вам не нужны сегменты в раскадровке или подготовка к сегменту в этом сценарии.
вы можете использовать этот метод :
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
вы можете выполнить функцию по выбору конкретной ячейки tableview в этом.
вы можете сделать это следующими методами:
во-первых, вам нужно импортировать другой контроллер вида в текущем виде.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}
внутри выше метод, вы должны вызвать метод
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
такой:yourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil]; [self.navigationController YourViewController animated:YES];
С помощью этого вы можете достичь толчок segue, когда
UITableViewCell
выбран..надеюсь, это может помочь вам...!
Swift 3
после ответа Ахмеда Дау - > вручную перетащите segue из vc в vc на раскадровке
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.performSegue(withIdentifier: "SegueIdentifier", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "SegueIdentifier" { //do something you want } }
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"segueIdentifier" sender:indexPath]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"segueIdentifier"]) { NSIndexPath *indexPath = (NSIndexPath *)sender; } }