2013-09-24 3 views
0

Может ли кто-нибудь сказать мне, почему я не могу передать данные между контроллерами представления?Невозможно передать данные между контроллерами вида

Любая помощь очень ценится!

Я получаю объект из NSMutableArray, а затем доступ к свойству placeId. Затем я хочу передать это следующему контроллеру представления (BIDCCreateViewController), но я не могу. Null всегда регистрируется из следующего диспетчера представлений.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BIDDCCreateViewController *biddccCreateViewController = [[BIDDCCreateViewController alloc]init]; 
    BIDBusinessModel *tempObjStore = [self.linkedBusinessParseModelArray objectAtIndex:indexPath.row]; 
    biddccCreateViewController.placeId = tempObjStore.placeId; 
    NSLog(@"tempObjStore in didselectrow: %@", tempObjStore.placeId); 

} 

#import <UIKit/UIKit.h> 

@interface BIDDCCreateViewController : UIViewController 
@property (strong, nonatomic) NSString *placeId; 
@end 

#import "BIDDCCreateViewController.h" 

@implementation BIDDCCreateViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    NSLog(@"SUCCESSFULLY PASSED PLACE ID: %@", self.placeId); 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

Мой выход из бревен выглядит следующим образом:

2013-09-24 14:01:49.208 CouponLocation[827:a0b] tempObjStore in didselectrow: 1f068b8d2b6a13daf9be5eddee5cb32585b76377 
2013-09-24 14:01:49.209 CouponLocation[827:a0b] SUCCESSFULLY PASSED PLACE ID: (null) 

Ничто не передается. Когда я устанавливаю строку в BIDCCCreateViewConroller и регистрирую ее, она работает нормально. Как вы можете видеть строку в viewcontroller, с которой я пытаюсь перейти, это нормально. Это демонстрируется в журнале tempOjcStore в didselectrow. Таким образом, там есть строка, но она не передается и, похоже, ничего не происходит с строкой в ​​другом диспетчере представлений, потому что я могу изменить это изнутри и регистрировать.

Как-то он не передается.

Любые предложения?

+0

У вас используется segue? Как вы показываете контроллер второго вида? – CRDave

+0

CRDave - BIDDCCreateViewController - это мой второй контроллер представления, который я пытаюсь переделать. – Anthony

+0

Чем следует ответ @dasblinkenlight – CRDave

ответ

2

Вы устанавливаете значение на неправильный объект: biddccCreateViewController является локальным для вашего метода, это не контроллер, который получает отображается позже, когда срабатывает segue (или какой бы то ни было метод, через который вы открываете фактический элемент управления view).

Вместо того, чтобы размещать код в didSelectRowAtIndexPath, введите код в prepareForSegue. Вы можете получить доступ к контроллеру целевого вида оттуда, как это:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([segue.identifier isEqualToString:@"openDetails"]){ 
     UITableViewCell *cell = (UITableViewCell *) sender; 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
     BIDDCCreateViewController *biddccCreateViewController = (BIDDCCreateViewController*)segue.destinationViewController; 
     BIDBusinessModel *tempObjStore = [self.linkedBusinessParseModelArray objectAtIndex:indexPath.row]; 
     biddccCreateViewController.placeId = tempObjStore.placeId; 
    } 
} 

Наконец, правильное место, чтобы отобразить значение placeId является viewWillAppear, не viewDidLoad, потому что загрузка зрения происходит, прежде чем вы можете установить placeId на контроллер.

+0

Я попробую это, но просто посмотрю на это, «indexPath.row» не будет работать, я предполагаю. Вот как я обращаюсь к правильному элементу моего NSmutableArray. Я считаю, что это решение не будет компилироваться (я предполагаю, но я попробую). Не могу я просто работать с моим текущим решением. Как это сделать, чтобы метод не был локальным. Возможно, я объявлю на @interface. Я дам вам знать, как я себя чувствую. – Anthony

+0

@ Энтони Я только что заметил это - взгляните на редактирование. 'self.tableView' должен быть вашим объектом' UITableView', а '@" openDetails "должен быть фактическим именем segue в вашем проекте. – dasblinkenlight

+1

Работал отлично! Благодарю вас и благодарю вас всех. – Anthony

0

Куда вы нажимаете вид BIDDCCreateViewController?

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BIDDCCreateViewController *biddccCreateViewController = [[BIDDCCreateViewController alloc]init]; 
    BIDBusinessModel *tempObjStore = [self.linkedBusinessParseModelArray objectAtIndex:indexPath.row]; 
    biddccCreateViewController.placeId = tempObjStore.placeId; 
    NSLog(@"tempObjStore in didselectrow: %@", tempObjStore.placeId); 


    [self.navigationController pushViewController:biddccCreateViewController]; 
} 

и вы обновите ваш контроллер представления это будет работать:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:YES]; 
    // Do any additional setup after loading the view. 
    NSLog(@"SUCCESSFULLY PASSED PLACE ID: %@", self.placeId); 
} 
+0

Привет, Теперь я вижу ошибку «Нет видимого @interface для« UINavigationController »объявляет селектор« pushViewController ». : -S – Anthony

0

Вы создаете BIDDCCreateViewController как локальную переменную, но фактический контроллер, который попадает в стек навигации, может быть другим. Возможно, вы устанавливаете свойство для неправильного объекта.

0

Вы должны нажать свой biddccCreateViewController в таблице таблиц - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath при его локальном создании. Добавьте шаг, чтобы нажать контроллер вида в этом методе.

1

Я думаю, что когда вы передаете значение tempObjStore.placeId в BIDDCCreateViewController из BIDBusinessModel, может быть передано значение перед открытием BIDDCCreateViewController, поэтому вы получаете значение NULL в BIDDCCreateViewController.

Выполните пример кода

В BIDDCCreateViewController

- (пустоты) ViewDidLoad

{ [собственной performSelector: @selector (GetValue) withObject: само afterDelay: 5,0];

}

- (пустоты) ПолучитьЗначение

{

NSLog (@ "успешно прошел МЕСТЕ ID:% @", self.placeId);

Смежные вопросы