NSString de otro UIViewController es nulo

¿Alguien podría explicarme por qué esto no funciona? Creo que es un problema realmente simple, pero por alguna razón no lo entiendo.

Mi problema: tengo un NSString en mi firstViewController con el valor "¡Hola!". Ahora quiero mostrar este valor en mi secondViewController pero el resultado es nulo.

Este es mi NSLog

2013-03-09  foo[95381:c07] value of foo in BITfirstViewcontroller: Hello!
2013-03-09  foo[95381:c07] value of foo in BITsecondViewcontroller: (null)

BITAppDelegado.m

#import "BITAppDelegate.h"
#import "BITfirstViewController.h"

@implementation BITAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    BITfirstViewController *fvc = [[BITfirstViewController alloc]init];

    // Create navigationController and set InputViewController as root for navController
    UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:fvc];

    [self.window setRootViewController:navController];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

BITfirstViewController.h

#import <UIKit/UIKit.h>

@interface BITfirstViewController : UIViewController

@property (strong, nonatomic) NSString *foo;

-(IBAction)showSecondView:(id)sender;


@end

BITfirstViewController.m

#import "BITfirstViewController.h"
#import "BITsecondViewController.h"

@interface BITfirstViewController ()

@end

@implementation BITfirstViewController

@synthesize foo;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        foo = [NSString stringWithFormat:@"Hello!"];
        NSLog(@"value of foo in BITfirstViewcontroller: %@",foo);

    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(showSecondView:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"Show View" forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
    [self.view addSubview:button];
}

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

-(IBAction)showSecondView:(id)sender;
{

    BITsecondViewController *svc = [[BITsecondViewController alloc]init];
    [self.navigationController pushViewController:svc animated:YES];
}

@end

BITsegundoViewController.h

#import <UIKit/UIKit.h>


@class BITfirstViewController;

@interface BITsecondViewController : UIViewController

@property (nonatomic, retain) BITfirstViewController *fvc;

@end

BITsegundoViewController.m

#import "BITsecondViewController.h"
#import "BITfirstViewController.h"

@interface BITsecondViewController ()

@end

@implementation BITsecondViewController

@synthesize fvc;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization

    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"value of foo in BITsecondViewcontroller: %@", fvc.foo);

}

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

@fin

preguntado el 09 de marzo de 13 a las 14:03

Está agregando el segundo controlador de vista, pero nunca está configurando fvc en él, por lo que es nulo. -

1 Respuestas

Pruebe esto en BITfirstViewController.m

-(IBAction)showSecondView:(id)sender;
{

    BITsecondViewController *svc = [[BITsecondViewController alloc]init];
    svc.fvc = self;  // you need to set this property as you prepare the svc
    [self.navigationController pushViewController:svc animated:YES];
}

EDIT:

Tus fvc y svc están encapsulados y no tienen conocimiento directo entre sí, excepto a través del uso de propiedades (al menos esa es la forma en que tratamos de hacer las cosas en OOP). Entonces, estabas en lo cierto al crear un @property en tu svc que le permitió tener un mango a su fvc, pero [[BITsecondViewController alloc]init] simplemente inicializará ese puntero a nil. Luego, debe configurar esa propiedad para que apunte al objeto deseado, que en este caso es el fvc. Desde el svc se está construyendo desde dentro de una instancia de BITFirstViewController, el identificador correcto para pasar es self.

respondido 09 mar '13, 15:03

¡eso funciono! gracias, pero le importaría (brevemente) explicar. - Eloy

¡Muchos gracias! Sabía que me estaba perdiendo algo. He estado tratando de hacer que esto funcione durante unos días. Probé varios enfoques, pero no fue hasta hoy que me di cuenta de que mi UIViewcontroller era el problema. Así que creé esta configuración 'svc' y 'fvc'. Simplemente pensé que mi NSMutableArray no estaba configurado correctamente en mi otro programa, ya que todas las entradas desaparecieron cuando volví a mi 'fvc'. - Eloy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.