Как сделать push-сегмент при выборе UITableViewCell


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

вопрос в том, Могу ли я создать push segue программно? Если нет, я могу передать эффект через prepareforsegue? Если я попытаюсь использовать prepareforsegue, Я бегу в проблему, где управление перетаскиванием из UITableView не позволяет мне создать push-сегмент для контроллера представления add effects.

10 54

10 ответов:

управления перетащите из контроллера вида в контроллер вида

From View Controller to View Controlle!

вам нужно будет дать идентификатор для вашего segue:

enter image description here

выполнить переход:

-(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.
  • управление перетаскиванием с первого контроллера вида с табличным видом на второй контроллер вида. Выбрать "шоу", как переход тип.

enter image description here

  • щелкните сегмент в раскадровке, а затем в имени инспектора атрибутов идентификатор "yourSegue". (Вы можете называть его как угодно, но вам также нужно использовать то же имя в коде.)

enter image description here

  • (необязательно) вы можете встроить все в навигационный контроллер, выбрав первый контроллер вида в раскадровке и собираюсь Редактор > Вставить В > Навигационный Контроллер.

код

первый вид контроллера с 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;

    }
}