web-dev-qa-db-ja.com

UITableViewCellが選択されたときにプッシュセグエを作成する方法

テーブルビューにエフェクトのリストがあります。新しいエフェクトを作成するのに役立つ別のView Controllerにセグエをプッシュする右上のバーボタンを作成しました。次に、テーブルビューのセルにプッシュセグエを追加して、エフェクト値がエフェクトビューの追加コントローラーに読み込まれるようにし、編集した値を保存できるようにします。

問題は、プログラムでプッシュセグエを作成できますか?そうでない場合、prepareforsegueを介してエフェクトを渡すことができますか? prepareforsegueを使用しようとすると、UITableViewからコントロールをドラッグしても、エフェクトビューコントローラーの追加にプッシュセグエを作成できないという問題が発生します。

59
Aviral Bajpai

control View ControllerからView Controllerにドラッグします

From View Controller to View Controlle!

セグエに識別子を与える必要があります:

enter image description here

セグエを実行します。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"yourSegue" sender:self];
}

ここに問題があります。ViewControllerにデータを渡す必要がある場合、これはセグエを実行するだけです。次に、次のセグエ委任を実装する必要があります。

- (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
    }
}
175
meda

Swift

この回答はデータの受け渡し方法を示しており、Xcode 8およびSwift 3用に更新されています。

プロジェクトのセットアップ方法は次のとおりです。

  • TableViewを使用してプロジェクトを作成します。簡単な例については、 here をご覧ください。
  • 2番目のViewControllerを追加します。
  • テーブルビューのある最初のView Controllerから2番目のView Controllerへのドラッグを制御します。セグエタイプとして[表示]を選択します。

enter image description here

  • ストーリーボードでセグエをクリックし、属性インスペクターで識別子「yourSegue」に名前を付けます。 (好きなように呼び出すことができますが、コードで同じ名前を使用する必要もあります。)

enter image description here

  • (オプション)ストーリーボードの最初のView Controllerを選択し、Editor> Embed In> Navigation Controllerを選択して、Navigation Controllerにすべてを埋め込むことができます。

コード

TableViewを備えた最初のView Controller:

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)
    }
}

View Controller間でデータを渡すことに関するより基本的な例については、 this answer を参照してください。

47
Suragch

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
        }
    }
}
46
skwashua
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"YourPushSegueName" sender:self];
}
13
Mayank Jain
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"];
    [self.navigationController pushViewController:myVController animated:YES];
}
5
Vineesh TP

次の2つのオプションがあります。ctrl+プロトタイプセルから新しいvcにドラッグしてから、各セルからセグエを実行し、セグエの準備を実装する必要があります。

2番目のオプション、didselectrowatindexpathでは、self.storyboard instantiateviewcontrollerwithidentifier ...を使用して新しいViewControllerをインスタンス化してから、pushviewcontrollerまたはpresentviewcontrollerを呼び出します。

3
Calin Chitu

このメソッドを使用できます:

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

これで特定のTableViewセルを選択する機能を実行できます。

2
PunjabiCoder

Swift

Ahmed Daouの回答をフォローアップした後、ストーリーボードで手動で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
    }
}
0
yonlau
- (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;

    }
}
0
Jarvan

これは、次の方法で実行できます。

まず、現在のビューに別のView Controllerをインポートする必要があります。

- (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];

これにより、UITableViewCellが選択されているときにプッシュセグエを実現できます。

これがあなたに役立つことを願っています...!

0
Bhanu