多くの場所で文書化されているのを見たことがありますが、管理できないようです。セグエ中に、あるビューから別のビューにデータを渡そうとしています。
次に、ソースビューの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);
}
}
あなたはこれを行うことによってそれを達成することができます:最初にここで目的のコントローラに送信したい値を渡します:
- (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
}
}
宛先のView Controllerのローカルインスタンス変数を作成する必要はありません。これは同じことを行います:
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"];
[segue.destinationViewController setLocInfo: [myValue valueForKeyPath:@"info"];
私はまったく同じ問題を抱えていたと思うので、私の解決策があなたにも役立つことを願っています。それはあなたの質問の最初の部分に答えるべきであるか、少なくとも他の誰かを助けるでしょう。
まず第一に、SecondViewControllerのviewDidLoad
メソッドを使用して、渡された値をプロパティに割り当てることはできません。これを行うと、viewDidLoadがSegueの前に実装されるため、nilが与えられます。
また、viewDidAppear
を使用することはお勧めしません。ビューが読み込まれた後に値が変更されるため、魔女は変更プロセスを視覚的に確認できるようにするからです。
したがって、最良のオプションは、値をIBOutlet's
に直接割り当てることです。文字列の配列を渡したい場合は、最初にロードしたい1つの配列値を割り当て、すべてのNSArray
も渡すことができます。これにより、ビューに既に値をロードできるようになります。また、他の値を操作することもできます。
メソッドを呼び出してデータを渡すこともできます。
あなたはこれを試すことができます:
[[NSString alloc] initWithFormat:@"%@",
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"]];
[[NSString alloc] initWithFormat:@"%@",
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"info"]];
別のオプション-次の方法を使用できます:
-(NSIndexPath *)tableView:(UITableView *)tableViewwillSelectRowAtIndexPath:( NSIndexPath *)indexPath
prepareForSegueの前に起動します。