Подтвердить что ты не робот

Ios передают значения во время segue в другое представление

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

Здесь метод 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);
}
}
4b9b3361

Ответ 1

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

- (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
    }
}

Ответ 2

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

[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"];
[segue.destinationViewController setLocInfo: [myValue valueForKeyPath:@"info"];

Ответ 4

Вы можете попробовать следующее:

[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"]];
[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"info"]];

Ответ 5

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

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

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

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

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