ios - pantalla - pasar datos entre view controllers swift 4
pasar ios valores durante un segue a otra vista (5)
Tratar de hacer algo que he visto documentado en muchos lugares, pero parece que no puedo manejar. Estoy tratando de pasar datos de una vista a otra durante una sesión.
Aquí está el método prepareForSegue en la vista de origen:
- (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);
}
Si NSLog
ese último NSLog
, veo los valores correctos ...
Aquí está la interfaz en la vista de destino:
#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
... y aquí está viewDidLoad y @synthesize relevantes en la vista de destino:
@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;
}
Ese NSLog
informa valores null
para cada una de esas variables.
Apreciaría cualquier ayuda que pudieras darme. Estoy seguro de que estoy haciendo algo estúpido y obvio.
Gracias de antemano por tu ayuda.
Mucho más tarde...
OK ... creo que lo estoy reduciendo.
He descubierto que (contraintuitivamente)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
es llamado después
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
Lo que es confuso, y también instaló mi pequeño esquema para descubrir qué parte de mi NSDictionary
datos NSDictionary
debería mostrarse en mi vista detallada. Actualmente estoy haciendo esto:
// 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]];
}
Pero como esto sucede después de la serie, es un poco inútil. ¿Cómo puedo acceder al número de fila en el método prepareForSegue?
Gracias de nuevo.
... y finalmente...
Aquí está la respuesta a la pregunta:
¿Cómo accedo a un número de fila seleccionado mientras estoy en el método prepareForSegue?
Esperemos que alguien lo encuentre útil.
Primero, configure un IBOutlet
para la vista de tabla en la interfaz del controlador listView:
@property (weak, nonatomic) IBOutlet UITableView *tableView;
Entonces tu prepareForSegue puede hacer esto:
- (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);
}
}
Creo que tuve absolutamente el mismo problema, así que espero que mi solución también te ayude. Debe responder la primera parte de su pregunta, o al menos ayudará a alguien más.
En primer lugar, no puede asignar valores pasados a propiedades con el método viewDidLoad
en el SecondViewController . Al hacerlo, da nil, ya que viewDidLoad se implementa antes de Segue.
Y no recomendaría usar viewDidAppear
, ya que los valores se cambiarán después de que se cargue la vista, lo que hace que el proceso de cambio sea visible visualmente.
Entonces, la mejor opción es asignar los valores directamente a los IBOutlet''s
. Si desea pasar una matriz de cadenas, puede asignar un valor de matriz que desea cargar primero y también pasar toda la NSArray
. Esto permitirá que su vista ya esté cargada con el valor, y también tendrá otros valores con los que trabajar.
También puedes llamar método y pasar datos.
No es necesario crear una variable de instancia local del controlador de vista de destino. Esto hará lo mismo:
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"];
[segue.destinationViewController setLocInfo: [myValue valueForKeyPath:@"info"];
Otra opción - podría usar el siguiente método:
que se dispara antes de prepararForSegue.
Puedes probar esto:
[[NSString alloc] initWithFormat:@"%@",
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"]];
[[NSString alloc] initWithFormat:@"%@",
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"info"]];
puede lograrlo haciendo esto: primero pase el valor que desea enviar al controlador de destino aquí:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self performSegueWithIdentifier:@"segueToLocation" sender:the object you want to pass];
}
entonces consigue el objeto aquí
- (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
}
}