Pregunta

Estoy añadiendo botón personalizado a mi UITableViewCell. En la acción de ese botón Quiero llamar a la función showAlert: y quiere pasar a la etiqueta de células en el método.

¿Cómo puedo pasar un parámetro en este método showAlert: action:@selector(showAlert:)

?
¿Fue útil?

Solución

Eso no es posible. Hay que crear un método conforme a IBAction

- (IBAction)buttonXYClicked:(id)sender;

En este método se puede crear y llamar a la UIAlertView. No olvide conectar el botón con el método en el Interface Builder.

Si desea distinguir entre varios botones (por ejemplo, tiene uno en cada celda de la tabla) se puede establecer la propiedad de etiqueta del botón. Y a continuación, comprobar sender.tag de la que el botón de clic viene.

Otros consejos

Si está utilizando Button en Tableviewcell entonces u tiene que añadir el valor de etiqueta para el botón de cada célula y establecer el método addTarget con id como parámetro.

Código de ejemplo:

A continuación tiene que escribir el código en el método cellForRowAtIndexPath.

{

     // Set tag to each button
        cell.btn1.tag = indexPath.row; 
        [cell.btn1 setTitle:@"Select" forState:UIControlStateNormal];  // Set title 

     // Add Target with passing id like this
        [cell.btn1 addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];    


     return cell;

}

-(void)btnClick:(id)sender
{

    UIButton* btn = (UIButton *) sender;

     // here btn is the selected button...
        NSLog(@"Button %d is selected",btn.tag); 


    // Show appropriate alert by tag values
}

La respuesta de Jay es grande, pero si tiene varias secciones que no funcionará ya que el indexRow es locales a una sección .

Otro método, si está usando los botones en un TableView que tiene varias secciones, es pasar los eventos de toque.

Cuando se declara el botón dentro de un cargador perezoso:

- (UIButton *)awesomeButton
{
    if(_awesomeButton == nil)
    {
        _awesomeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [_awesomeButton addTarget:self.drugViewController action:@selector(buttonPressed:event:) forControlEvents:UIControlEventTouchUpInside];
    }

    return _awesomeButton;
}

La clave aquí es la cadena de eventos sobre el método de selección. No se puede pasar sus propios parámetros, pero se pueden pasar los acontecimientos.

La función del botón se engancha a:

- (void)buttonPressed:(id)sender event:(id)event
{
    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];

    CGPoint currentTouchPosition = [touch locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];

    NSLog(@"Button %d was pressed in section %d",indexPath.row, indexPath.section);
}

La clave aquí es la indexPathForRowAtPoint función. Esta es una función ingeniosa en UITableView que le dará la indexPath en cualquier punto. También es importante la función locationInView porque necesita el toque en el contexto de la tableView por lo que puede determinar la indexPath específica.

Esto le permitirá saber qué botón fue, en una tabla con varias secciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top