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);
}
}
Ответы
Ответ 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"];
Ответ 3
Другая опция - может использовать следующий метод:
- (NSIndexPath *) tableView: (UITableView *) tableView willSelectRowAtIndexPath:( NSIndexPath *) indexPath
который срабатывает перед тем, как подготовитьForSegue.
Ответ 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
. Это позволит вашему представлению загрузить уже значение, а также вы будете иметь другие значения для работы.
Вы также можете вызвать метод и передать данные.