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