プログラムでセグエを実行し、パラメーターを宛先ビューに渡します


174

私のアプリには、プログラムでセグエを実行するボタンがあります。

- (void)myButtonMethod
{
    //execute segue programmatically
    [self performSegueWithIdentifier: @"MySegue" sender: self];
}

宛先ビューを参照してそれにいくつかのパラメーターを渡す方法があるかどうか知りたいのですが。

私は中にいることを知っているprepareForSegue方法で、私はそれを参照することができますmyDestinationViewController *vc = [segue destinationViewController];が、これは、プログラムでセグエを実行する方法を私は知りません。

あなたはなにか考えはありますか?

ありがとう、ヤッサ


更新:

この質問でごめんなさい!!! セグエがプログラムで呼び出されたとしても、prepareForSegueメソッドはとにかく呼び出されるので、通常と同じ方法でパラメーターを渡すことができることを発見しました。


44
更新を回答として追加し、承認して、これが回答されたことを人々に知らせます:)
danielbeard

通知用の回答、コメントを追加します。
DanSkeel

11
以下の答えを正解としてマークを付けてください。そうすれば、回答が解答されたことがわかります。
リンドンフォックス

回答:


107

答えは、単にセグエがトリガーされる方法に違いはないということです。

prepareForSegue:sender:この方法は、どのような場合に呼ばれて、あなたは全体のあなたのパラメータを渡す場所です。


3
これはまだ私を悩ませています-これは私が1つの場所でセグエをトリガーする必要があることを意味します、ここで送信したいデータを他のものからうまく分離されたパラメーターとして持っていますが、そのデータを完全に異なる場所に追加します-prepareForSegue渡す必要のあるデータについて何も知りません。つまり、2つの異なる関数(1つはセグエをトリガーし、もう1つは準備中)が共有するコンテキストで、問題のデータで状態を作成する必要があります。必要なのは、データを含む新しいビューを開くことだけなのに、状態を汚したくない...
NeverwinterMoon

送信者を使用して、宛先VCを構成するために必要なコンテキストを渡す
トラッパー

送信側でペイロードを渡すことはアンチパターンであると想定しました。誰がセグエをトリガーしたかに関する情報のみを含むべきであり、セグエをトリガーしたものがさらに通過することを意図したデータではありません。
NeverwinterMoon 2018

送信者の公式ドキュメントから:「このオブジェクトは、実際のセグエ中に情報提供の目的で利用可能になります。」
NeverwinterMoon 2018

1
ええ、実際のペイロードを渡さず、どのセル/ボタン/インデックス/などがセグエをトリガーしたかのようなコンテキストを渡します。
トラッパー2018

90

古い質問ですが、ここにあなたが求めていることを行う方法に関するコードがあります。この場合、テーブルビューで選択したセルから別のビューコントローラーにデータを渡します。

trgetビューの.hファイル内:

@property(weak, nonatomic)  NSObject* dataModel;

.mファイル内:

@synthesize dataModel;

dataModelすることができstringintまたはこの場合のように、それは多くの項目が含まれているモデルです

- (void)someMethod {
     [self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 }

または...

- (void)someMethod {
    UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
    [self.navigationController pushViewController: myController animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"storyDetailsSegway"]) {
        UITableViewCell *cell = (UITableViewCell *) sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSDictionary *storiesDict =[topStories objectAtIndex:[indexPath row]];
        StoryModel *storyModel = [[StoryModel alloc] init];
        storyModel = storiesDict;
        StoryDetails *controller = (StoryDetails *)segue.destinationViewController;
        controller.dataModel= storyModel;
    }
}

3

スウィフト4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

スウィフト3:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }

0

セグエを1か所で実行し、セグエの準備のためにパラメーターを送信する状態を維持する問題を理解しています。

私はこれを行う方法を見つけました。カテゴリを使用して、userInfoDictというプロパティをViewControllersに追加しました。また、送信者が自己の場合(コントローラ自体を意味する)のように、識別子を使用して実行セグエをオーバーライドしました。このuserInfoDictを次のViewControllerに渡します。

ここでは、UserInfoDict全体を渡す代わりに、送信者として特定のパラメーターを渡し、それに応じてオーバーライドすることもできます。

あなたが覚えておく必要がある1つのこと。ur performSegueメソッドでスーパーメソッドを呼び出すことを忘れないでください。


0

新しいSwiftバージョンを使用する場合。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ChannelMoreSegue" {

        }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.