Пытаюсь сделать что-то, что я видел в документации во многих местах, но не могу справиться. Я пытаюсь передать данные из одного представления в другое во время перехода.
Вот метод 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);
}
}