En el objetivo-c, ¿cómo puedo asignar una acción al evento de alguien presionando uno de los UITableViewCells que se han instanciado en un controlador UITableView? Básicamente, la acción general que estoy tratando de lograr es que un usuario pueda hacer clic en un UITableViewCell, que luego abre un nuevo controlador de vista que contiene la información que corresponde a la ID de ese UITableViewCell, específicamente.

0
user9401139 27 feb. 2018 a las 21:32

5 respuestas

La mejor respuesta

Escriba el siguiente código en su archivo FirstViewController.m

#import "FirstViewController.h"

@interface FirstViewController ()<UITableViewDelegate,UITableViewDataSource>
{

}
@end
@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableviewName.delegate = self;
    self.tableviewName.dataSource = self;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    SecoundViewController *secoundVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecoundVC”];
    secoundVC.cellId = @“pass your data here”; 
    [self.navigationController pushViewController:secoundVC animated:YES];

}

Escriba el código a continuación en su archivo SecoundViewController.h

@property (strong, nonatomic) NSString *cellId;

Escriba el código a continuación en su archivo SecoundViewController.m

#import "SecoundViewController.h"

@interface SecoundViewController ()
{

}
@end
@implementation SecoundViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"cellId----%@",self.cellId);

}
0
Rajesh Dharani 1 mar. 2018 a las 05:14

Prueba con este código:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath
{

    //Perform segue here


}
0
Isaac Bosca 27 feb. 2018 a las 18:43

En su controlador de vista DESTINO (.h):

@property (strong, nonatomic) NSString *idDetail;

Luego, en su controlador de vista ORIGIN (donde tiene su mesa):

@property int idCell;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.idCell = indexPath.row
    [self performSegueWithIdentifier:@"detailViewController" sender:sender];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"detailViewController"]) {
        SecondVC *vc = [segue destinationViewController];
        vc.idDetail = idCell;
    }
}
0
GIJOW 27 feb. 2018 a las 19:01

Simplemente agregue un reconocedor de gestos de toque al crear la celda en la fuente de datos:

override func tableView(_ tableView: UITableView, 
    cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = ...
    if cell.gestureRecognizers.count == 0 {
        var recognizer = UITapGestureRecognizer(target: self, action: 
            #selector(handleCellTap(sender:)))
        recognizer.numberOfTapsRequired = 1
        cell.addGestureRecognizer(recognizer)
    }
}

func handleCellTap(sender: UITapGestureRecognizer) {
    guard let viewCell = sender.view as? UITableViewCell else {
        return
    }
    ...
}

Si su fuente de datos y controlador tienen la misma clase, puede simplemente pushViewController en la función handleCellTap.

Usar didSelectRowAtIndexPath no es lo que quieres, creo.

Perdón por posibles errores tipográficos, no tengo XCode ahora para probar.

0
Serega 27 feb. 2018 a las 19:03

Puede lograr esto sin usar segues. Simplemente cree una instancia del controlador de vista del guión gráfico y pase los datos (si es necesario) a cualquier parámetro global.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    Session *session = self.arrSessions[indexPath.row];
    ExampleViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ExampleViewController"];
    controller.selectedSession = session; 
    [self.navigationController pushViewController:controller animated:YES];
}
0
B.Sanyal 27 feb. 2018 a las 19:39