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?

Надеюсь, кому-то это будет полезно.

Во-первых, настройте IBOutletдля tableview в интерфейсе контроллера listView:

@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
задан Daniel 6 August 2012 в 03:55
поделиться