Necesito un poco de orientación sobre la creación de un UITableViewCell que tiene una imagen en la izquierda, que se pueden activar o desactivar. La imagen debe ser de tocar y actuar como un conmutador (casilla de verificación).

Mis partes yo estoy luchando con son:

  1. ¿Cómo detectar pulsaciones en la imagen y manejar de manera diferente a didSelectRowAtIndexPath?
  2. ¿Cómo puedo cambiar la imagen sin necesidad de realizar un [tableView reloadData]?
  • hola rein, ¿cómo se puede hacer esta imagen a su pregunta ?Es allí cualquier software disponible para esta?
  • De donde sacas el icono de marca de verificación?
  • Puedo también bache donde tienes que icono de marca de verificación de?
  • ¿cómo usted cree que el botón atrás(arriba a la izquierda)?
  • esto no es de mi aplicación – es de una app llamada tienda de Comestibles. sophiestication.com/groceries
InformationsquelleAutor rein | 2009-07-23

6 Comentarios

  1. 28

    De hecho, es bastante fácil.

    Acaba de crear una nueva subclase de UIControl y ponerlo todo ahí (sin necesidad de un controlador separado.) Vamos a llamar a ToggleImageControl.

    @interface ToggleImageControl : UIControl
    {
       BOOL selected;
       UIImageView *imageView;
       UIImage *normalImage;
       UIImage *selectedImage;
    }

    Crear un ToggleImageControl para cada celda, y agregarlo en la posición adecuada.

    ToggleImageControl *toggleControl = [[ToggleImageControl alloc] initWithFrame: <frame>];
    toggleControl.tag = indexPath.row;  //for reference in notifications.
    [cell.contentView addSubview: toggleControl];

    Agregar un UIImageView para contener la imagen. Agregar un destino para el evento táctil.

    - (void) viewDidLoad
    {
       normalImage = [UIImage imageNamed: @"normal.png"];
       selectedImage = [UIImage imageNamed: @"selected.png"];
       imageView = [[UIImageView alloc] initWithImage: normalImage];
       //set imageView frame
       [self.view addSubview: imageView];
    
    [self addTarget: self action: @selector(toggleImage) forControlEvents: UIControlEventTouchUpInside];
    
    }

    Conjunto de la UIImageView la imagen de la propiedad para la actualización de la imagen; en la que se activará el redibujado, sin efectos secundarios.

    - (void) toggleImage
    {
       selected = !selected;
       imageView.image = (selected ? selectedImage : normalImage); 
    
       //Use NSNotification or other method to notify data model about state change.
       //Notification example:
       NSDictionary *dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: self.tag forKey: @"CellCheckToggled"];
       [[NSNotificationCenter defaultCenter] postNotificationName: @"CellCheckToggled" object: self userInfo: dict];
    
    }

    Obviamente se necesita para masaje algunas cosas. Usted probablemente desea pasar en la imagen de dos nombres para que sea más reutilizable, y también me gustaría recomendar la especificación de la notificación nombre de la cadena desde el exterior del objeto así (asumiendo que usted está utilizando el método de notificación.)

    • P. S. — en realidad hago algunas cosas de esa manera, funciona.
    • Esto es genial! Gracias. Una pregunta, cuando el toggleImage de control se toca el grifo no se traspasa a la UITableViewControl del didSelectRowAtIndexPath. La correcta?
    • No, el botón lo intercepta y evita ser visto por la célula.
    • Puede que también acaba de hacer este control de un marco vacío y el uso de las células ya existentes.imageView propiedad para dibujar la imagen real?
    • sehugg: Probablemente. Casi cualquier cosa se puede hacer a través de la superposición de controles.
    • gracias por este exactamente lo que estoy buscando
    • Cuando el desplazamiento en formato tableview imágenes desaparecen. No se encuentra claramente de trabajo.

  2. 6

    Aquí una aplicación de la «anular touchesBegan:» enfoque que estoy usando que es simple y parece que funciona bien.

    Basta con incluir esta clase en el proyecto y crear y configurar un TouchIconTableViewCell en lugar de un UITableView celular en su tableView:cellForRowAtIndexPath: método.

    TouchIconTableViewCell.h:

    #import <UIKit/UIKit.h>
    
    @class TouchIconTableViewCell;
    
    @protocol TouchIconTableViewCellDelegate<NSObject>
    
    @required
    - (void)tableViewCellIconTouched:(TouchIconTableViewCell *)cell indexPath:(NSIndexPath *)indexPath;
    
    @end
    
    @interface TouchIconTableViewCell : UITableViewCell {
        id<TouchIconTableViewCellDelegate> touchIconDelegate;       //note: not retained
        NSIndexPath *touchIconIndexPath;
    }
    
    @property (nonatomic, assign) id<TouchIconTableViewCellDelegate> touchIconDelegate;
    @property (nonatomic, retain) NSIndexPath *touchIconIndexPath;
    
    @end

    TouchIconTableViewCell.m:

    #import "TouchIconTableViewCell.h"
    
    @implementation TouchIconTableViewCell
    
    @synthesize touchIconDelegate;
    @synthesize touchIconIndexPath;
    
    - (void)dealloc {
        [touchIconIndexPath release];
        [super dealloc];
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        CGPoint location = [((UITouch *)[touches anyObject]) locationInView:self];
        if (CGRectContainsPoint(self.imageView.frame, location)) {
            [self.touchIconDelegate tableViewCellIconTouched:self indexPath:self.touchIconIndexPath];
            return;
        }
        [super touchesBegan:touches withEvent:event];
    }
    
    @end

    Cada momento de crear o re-uso de la célula, el conjunto de la touchIconDelegate y touchIconIndexPath propiedades. Cuando el icono está tocado, el delegado será invocado. A continuación, puede actualizar el icono o lo que sea.

    • lo siento, pero ¿qué es exactamente lo que quieres decir por «establecer la touchIconDelegate y touchIconIndexPath propiedades»?
    • Por ejemplo:// creamos la célula TouchIconTableViewCell celulares * = (TouchIconTableViewCell *)[formato tableview dequeueReusableCellWithIdentifier:ident]; si (celda == nil) de la célula = [[[TouchIconTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ident] grupo de liberación automática]; la célula.touchIconDelegate = auto; la célula.touchIconIndexPath = indexPath;
    • Me gusta. Parecía un poco más simple de crear otro control para lanzar en mi costumbre de celda de tabla.
  3. 4

    Por lo que el «..obviamente necesidad de masaje algunas cosas..» comentario significa «…este código no funciona…».

    Así

    - (void) viewDidLoad

    debe ser

    - (id)initWithFrame:(CGRect)frame 
    {
     if ( self = [super initWithFrame: frame] ){
      normalImage = [UIImage imageNamed: @"toggleImageNormal.png"];
      selectedImage = [UIImage imageNamed: @"toggleImageSelected.png"];
      imageView = [[UIImageView alloc] initWithImage: normalImage];
    
     //set imageView frame
      [self addSubview: imageView];
    
      [self addTarget: self action: @selector(toggleImage) forControlEvents: UIControlEventTouchDown];
     }
    
     return self;
    }

    Como - (void) viewDidLoad nunca se llama.

  4. 3

    Parece que Apple subido «TableMultiSelect» como códigos de ejemplo en iOS Developer Program desde 2011-10-12.

    De selección múltiple en el modo de edición puede ser activado por este código.

    self.tableView.allowsMultipleSelectionDuringEditing = YES;

    http://developer.apple.com/library/ios/#samplecode/TableMultiSelect/Introduction/Intro.html

    A pesar de que sólo puede ser utilizado de iOS5.

    Varias horas que no he podido encontrar este código de ejemplo en el Desbordamiento de la Pila, así que he añadido esta info para este post.

    • Esto es algo muy bonito código de ejemplo. Gracias por traer a nuestra atención.
  5. 1

    Hay una manera más FÁCIL de hacer esto, si reemplazar touchesBegan: lo que usted necesita hacer una declaración de si para decidir si es dentro de las marcas de verificación de proximidad, si no llamar [super touchesBegan:touches withEvent:event] y actuará como si fuera seleccionado.

  6. 0

    Hago algo similar (protagonizada por una de las favoritas) como este, pero creo que está exigiendo mucho de los pulgares de los usuarios de iPhone con la célula de dirigir a la gente a otro punto de vista. Primero que todo, me gustaría comprobar los detalles de divulgación de opción sobre las células. Una de las opciones es un pre-hechos botón de flecha que se puede adjuntar. Su llamada.

    Usted puede ser capaz de salirse con la captura de la didSelectRowAtIndexPath evento y, a continuación, hacer alguna otra lógica en lugar de redirigir si el contacto fue en su casilla de verificación, aunque no sé cómo se podría obtener la posición. Esto significa que usted puede ser que necesite para encontrar una manera de captar el evento de toque antes de que llame a didSelectRowAtIndex camino, que no estoy muy seguro de cómo hacerlo. Ha trabajado con el manejo de touchesBegan y como todavía?

    • La captura de pantalla que he enlazado es a partir de la compra de la aplicación por Sophiestication (sophiestication.com/groceries). Sé que es posible debido a que la aplicación lo hace y funciona bastante bien. He estado evitando crear mi propia UITableViewCell clase – hasta ahora he salido con poner puntos de vista en la contentView. Para implementar touchesBegan correctamente creo que no tengo ninguna opción pero para crear mi propio UITableViewCell clase. ¿Cómo escribir el código de estrellas en sus filas como favoritos?

Dejar respuesta

Please enter your comment!
Please enter your name here