IOS передать значения во время перехода к другому представлению - PullRequest
27 голосов
/ 28 марта 2012

Попытка сделать что-то, что я видела задокументировано во многих местах, но, похоже, не удается. Я пытаюсь передать данные из одного представления в другое во время сеанса.

Вот метод 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);
}
}

Ответы [ 5 ]

11 голосов
/ 24 августа 2012

вы можете достичь этого, выполнив следующее: сначала передайте значение, которое вы хотите отправить, контроллеру назначения здесь:

- (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
    }
}
4 голосов
/ 02 июня 2012

Вам не нужно создавать локальную переменную экземпляра целевого контроллера представления. Это будет делать то же самое:

[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"];
[segue.destinationViewController setLocInfo: [myValue valueForKeyPath:@"info"];
1 голос
/ 27 января 2013

Я думаю, что у меня была абсолютно такая же проблема, поэтому надеюсь, что моё решение тоже вам поможет.Он должен ответить на первую часть вашего вопроса или, по крайней мере, поможет кому-то еще.

Прежде всего, вы не можете присвоить переданные значения свойствам с помощью метода viewDidLoad в SecondViewController ,Это дает ноль, так как viewDidLoad реализован до Segue.

И я бы не рекомендовал использовать viewDidAppear, так как значения будут изменены после загрузки представления, ведь процесс изменения будетвизуально видимый.

Таким образом, наилучшим вариантом является присвоение значений непосредственно IBOutlet's.Если вы хотите передать массив строк, вы можете назначить одно значение массива, которое вы хотите загрузить первым, а также передать все NSArray.Это позволит вашему представлению уже загружаться со значением, а также у вас будут другие значения для работы.

Вы также можете вызывать метод и передавать данные.

1 голос
/ 13 июля 2012

Вы можете попробовать это:

[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"]];
[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"info"]];
1 голос
/ 07 июня 2012

Другой вариант - можно использовать следующий метод:

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

, который срабатывает перед подготовкой к сеансу.

...