Невозможно передать значение обратно в parentViewController - PullRequest
4 голосов
/ 20 февраля 2012

У меня есть masterViewController и detailViewController. Masterview толкает detailView. Возвращаясь к masteViewController, я хочу обновить значение foo. Но я получаю только NULL из nslog. Как я могу установить значение parenteViewContrller.foo в @ "bar" при навигации назад?

masterViewController.h

    NSString *foo; 
    -(void)setFoo:(NSString *)fooValue
    @property(nonatomic, retain) NSString *foo; 

masterViewController.m

@synthesize foo;

-(void)setFoo:(NSString *)fooValue{

    NSLog(@"updated foo:%@", fooValue);
}

detailViewController.m

-(void)goBack{
    [self.navigationController.parentViewController setValue:@"bar" forKey:@"foo"];
    [self.navigationController popViewControllerAnimated:YES];
}

Ответы [ 5 ]

7 голосов
/ 20 февраля 2012

[UIViewController parentViewController] не вернет то, что вы ожидаете от iOS 5 и выше, вместо этого вы должны использовать [UIViewController presentingViewController]

Если вы только нацеливаетесь на iOS 5, вместо этого достаточно просто начать использовать presentingViewController, но если нет, я бы посоветовал вам вручную передать UIViewController на:

// DetailViewController.h

@class MasterViewController;

@interface DetailViewController : UIViewController

@property (assign, nonatomic) MasterViewController *masterViewController;

@end


// DetailViewController.m

#import "DetailViewController.h"
#import "MasterViewController.h"

@implementation DetailViewController

- (void)goBack {

    [self.masterViewController setFoo:@"bar"];

    // dismiss this view controller
}

@end


// MasterViewController.h

@interface MasterViewController : UIViewController

- (void)setFoo:(NSString *)bar;

@end


// MasterViewController.m

#import "MasterViewController.h"
#import "DetailViewController.h"

@implementation MasterViewController

- (void)goForward {

    DetailViewController *detailViewController = ...;
    [detailViewController setMasterViewController:self];

    // present this view controller
}

@end
0 голосов
/ 20 февраля 2012

Обычно при этом сценарии вам нужно использовать делегат. Проверьте мой ответ на этот похожий вопрос в этом SO .

0 голосов
/ 20 февраля 2012

gЕсли вы хотите передать объект родителю, вы можете попробовать создать внешний файл в файле заголовка и импортировать заголовок в контроллер, где вы хотите его использовать, однако ЭТО НЕ ЛУЧШАЯ ПРАКТИКА, но это быстрое решение импорт

extern MyObject* Object;
@interface GlobalVariables : NSObject {

}

@end

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

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

0 голосов
/ 20 февраля 2012

Передать ссылку мастера с назначенным свойством в подробный вид.Используя эту ссылку, установите значение foo перед выполнением всплывающего действия.

0 голосов
/ 20 февраля 2012

Для того чтобы setValue: ForKey: работал, ваш контроллер представления должен соответствовать протоколу NSKeyValueCoding .

Попробуйте:

-(void)goBack{
    [self.navigationController.parentViewController setFoo:@"bar"];
    [self.navigationController popViewControllerAnimated:YES];
}

и нене забудьте сохранить / освободить соответствующим образом в вашем setFoo: методе.Вам, вероятно, также нужно набрать cast parentViewController, чтобы избежать каких-либо предупреждений.

...