web-dev-qa-db-ja.com

iOSはセグエ中に別のビューに値を渡します

多くの場所で文書化されているのを見たことがありますが、管理できないようです。セグエ中に、あるビューから別のビューにデータを渡そうとしています。

次に、ソースビューのprepareForSegueメソッドを示します。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    //pass values
DetailViewController *dest = (DetailViewController *)[segue destinationViewController];

dest.locTitle = [value valueForKeyPath:@"title"];
dest.locInfo = [value valueForKeyPath:@"info"];



// NSLog(@"The title is: %@, and the info is: %@.",dest.locTitle,dest.locInfo);

}

最後のNSLogを有効にすると、正しい値が表示されます...

宛先ビューのインターフェースは次のとおりです。

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController{

}

@property (strong, nonatomic) NSString *locTitle;
@property (strong, nonatomic) NSString *locInfo;
@property (weak, nonatomic) IBOutlet UILabel *detailMainText;
@property (weak, nonatomic) IBOutlet UILabel *detailTitle;

@end

...そして、これが宛先ビューのviewDidLoadと関連する@synthesizeです。

@synthesize detailMainText,detailTitle,locTitle,locInfo;

- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"In viewDidLoad - the title is: %@ and the info is: %@",self.locTitle,self.locInfo);
detailTitle.text = locTitle;
detailMainText.text = locInfo;
}

そのNSLogは、これらの各変数のnull値を報告します。

あなたが私に与えることができるどんな助けにも感謝します。私は愚かで明白なことをしていると確信しています。

よろしくお願いします。


かなり後に...


わかりました…絞り込んでいると思います。

私はそれを発見しました(逆に)

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

呼び出されます

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

これは混乱を招きます。また、私のNSDictionaryデータソースのどのチャンクを詳細ビューに表示する必要があるかを理解するために、私の小さなスキームをホースアップしました。現在私はこれをやっています:

// send info to detail view according to which row selected
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //Get the selected object in order to fill out the detail view
    myValue = [myLocations objectForKey:[locationsIndex objectAtIndex:indexPath.row]];

}

しかし、これはセグエが発生するため、少し役に立たない。 prepareForSegueメソッドで行番号にアクセスするにはどうすればよいですか?

再度、感謝します。


... そして最後に...


質問に対する答えは次のとおりです。

prepareForSegueメソッドで選択した行番号にアクセスするにはどうすればよいですか?

うまくいけば、誰かがそれを役に立つと思うでしょう。

まず、listViewコントローラーのインターフェースでテーブルビューのIBOutletを設定します。

@property (weak, nonatomic) IBOutlet UITableView *tableView;

次に、prepareForSegueがこれを実行できます。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString: @"showDetail"]) {
    //pass values
    NSLog(@"The sender is %@",sender);

    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    //Get the selected object in order to fill out the detail view
    id myValue = [myLocations objectForKey:[locationsIndex objectAtIndex:indexPath.row]];

    DetailViewController *dest = [segue destinationViewController];
    dest.locTitle = [myValue valueForKeyPath:@"title"];
    dest.locInfo = [myValue valueForKeyPath:@"info"];

    //NSLog(@"The title is: %@, and the info is: %@.",dest.locTitle,dest.locInfo);
}
}
27
james Burns

あなたはこれを行うことによってそれを達成することができます:最初にここで目的のコントローラに送信したい値を渡します:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [self performSegueWithIdentifier:@"segueToLocation" sender:the object you want to pass];
}

次に、ここにオブジェクトを取得します

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString: @"segueToLocation"]) {    
         DetailViewController *dest = (DetailViewController *)[segue destinationViewController];
         //the sender is what you pass into the previous method
         dest.target=sender
    }
}
11
ltebean

宛先のView Controllerのローカルインスタンス変数を作成する必要はありません。これは同じことを行います:

[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"];
[segue.destinationViewController setLocInfo: [myValue valueForKeyPath:@"info"];
4
Unsure1

私はまったく同じ問題を抱えていたと思うので、私の解決策があなたにも役立つことを願っています。それはあなたの質問の最初の部分に答えるべきであるか、少なくとも他の誰かを助けるでしょう。

まず第一に、SecondViewControllerviewDidLoadメソッドを使用して、渡された値をプロパティに割り当てることはできません。これを行うと、viewDidLoadがSegueの前に実装されるため、nilが与えられます。

また、viewDidAppearを使用することはお勧めしません。ビューが読み込まれた後に値が変更されるため、魔女は変更プロセスを視覚的に確認できるようにするからです。

したがって、最良のオプションは、値をIBOutlet'sに直接割り当てることです。文字列の配列を渡したい場合は、最初にロードしたい1つの配列値を割り当て、すべてのNSArrayも渡すことができます。これにより、ビューに既に値をロードできるようになります。また、他の値を操作することもできます。

メソッドを呼び出してデータを渡すこともできます。

1
Jonauz

あなたはこれを試すことができます:

[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"]];
[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"info"]];
1
Sunil_Vaishnav

別のオプション-次の方法を使用できます:

-(NSIndexPath *)tableView:(UITableView *)tableViewwillSelectRowAtIndexPath:( NSIndexPath *)indexPath

prepareForSegueの前に起動します。

1
resedasue