web-dev-qa-db-ja.com

プログラム的にSegueを実行し、デスティネーションビューにパラメータを渡す

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

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

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

prepareForSegueメソッドでは、myDestinationViewController *vc = [segue destinationViewController];で参照できることを知っていますが、これをプログラムで実行する方法がわかりません。

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

ありがとう、yassa


更新:

この質問を残念に思う!たとえsegueがプログラム的に呼び出されたとしても、prepareForSegueメソッドがとにかく呼び出されるので、通常の方法でパラメータを渡すことが可能であることを私は単に発見しました。

173
yassassin

答えは単にそれがセグエが引き起こされる方法に違いがないということです。

prepareForSegue:sender:メソッドはどのような場合にも呼び出され、ここがあなたのパラメータを渡すところです。

105
trapper

昔の質問ですが、ここにあなたが求めていることをどのように行うかについてのコードがあります。この場合、Table Viewで選択したセルから別のView Controllerにデータを渡しています。

trgetビューの.hファイルでは、

@property(weak, nonatomic)  NSObject* dataModel;

.mファイル内:

@synthesize dataModel;

dataModelstringint、またはこの場合のように多くの項目を含むモデルです。

- (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;
    }
}
90
user1723341

スイフト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"
            }
        }
    }
2

私は一箇所でセグエを実行し、セグエに備えてパラメータを送信する状態を維持することの問題を理解しています。

私はこれを行う方法を考え出しました。カテゴリを使用して、ViewControllersにuserInfoDictというプロパティを追加しました。そして、私は、送信者が自己の場合(コントローラ自体を意味する)、というような方法で、識別子を使ったセグエ実行も上書きします。このuserInfoDictを次のViewControllerに渡します。

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

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

0
karthik1729

あなたが新しいSwiftバージョンを使うならば。

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

        }
}
0
Pokotuz