iphone objective-c uitableview uislider

iphone - ¿Cómo agregar una subvista a una UITableViewCell y cambiar su tamaño en el modo de edición?



objective-c uislider (5)

Editar: Estoy empezando una recompensa por este, ya que estoy buscando una solución "limpia" con una subclase UITableViewCell , en lugar de jugar con el delegado UITableView y el origen de datos. Idealmente, me gustaría ver cómo podría manejar los eventos de UISlider . ¡Gracias!

Estoy usando un UITableView estilo UITableView y tengo varias celdas que se ven así:

Ahora, mientras estoy en el modo de edición , me gustaría tener un UISlider que establezca el valor del UILabel correcto, para que el resultado se vea así:

¿Podría alguien señalarme en la dirección correcta? Ni siquiera estoy seguro de si debería hacerlo subclasificando UITableViewCell o en IB. Los fragmentos de código serían muy apreciados :)


En lo que a mi conocimiento se refiere, puedes agregar tu control deslizante cuando comience la edición. Quiero decir en el siguiente método.

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath*)indexPath { /* Add your slider. */ }

Gracias.


En primer lugar, cree un nuevo proyecto basado en navegación, luego cree un nuevo archivo de clase llamado CustomCell.h y CustomCell.m , respectivamente.

Copie y pegue este código en su archivo RootViewController.m :

#import "RootViewController.h" #import "CustomCell.h" @implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.rightBarButtonItem=self.editButtonItem; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 2; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; } cell.mainLabel.text=@"ValueName"; return cell; } - (void)setEditing:(BOOL)editing animated:(BOOL)animated { [super setEditing:editing animated:animated]; [self.tableView beginUpdates]; [self.tableView endUpdates]; } - (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if(tableView.editing){ return 70; } return 44; } - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { return NO; } - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleNone; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { return; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)viewDidUnload { [super viewDidUnload]; } - (void)dealloc { [super dealloc]; } @end

CustomCell.h:

#import <UIKit/UIKit.h> @interface CustomCell : UITableViewCell { } @property (nonatomic, retain) UILabel *mainLabel; @property (nonatomic, retain) UILabel *detailLabel; @property (nonatomic, retain) UISlider *slider; @end

CustomCell.m:

#import "CustomCell.h" @implementation CustomCell @synthesize mainLabel, detailLabel, slider; - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { slider = [[UISlider alloc] initWithFrame:CGRectMake(10, 12, 280, 0)]; slider.alpha = 0; slider.maximumValue = 30; slider.autoresizingMask = UIViewAutoresizingFlexibleTopMargin; [self.contentView addSubview:slider]; [slider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventTouchDragInside]; [slider release]; mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 12, 150, 20)]; mainLabel.highlightedTextColor = [UIColor whiteColor]; mainLabel.backgroundColor = [UIColor clearColor]; [self.contentView addSubview:mainLabel]; [mainLabel release]; detailLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.bounds.size.width-180, 12, 150, 20)]; detailLabel.textAlignment=UITextAlignmentRight; detailLabel.text = [NSString stringWithFormat:@"%i", lroundf(slider.value)]; detailLabel.highlightedTextColor = [UIColor whiteColor]; detailLabel.backgroundColor = [UIColor clearColor]; [self.contentView addSubview:detailLabel]; [detailLabel release]; } return self; } - (void)setEditing:(BOOL)editing animated:(BOOL)animated { [super setEditing:editing animated:animated]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; [UIView setAnimationDelegate:self]; [UIView setAnimationBeginsFromCurrentState:YES]; if(editing){ slider.alpha = 1; slider.userInteractionEnabled=YES; }else{ slider.alpha = 0; slider.userInteractionEnabled=NO; } [UIView commitAnimations]; } -(IBAction) sliderChanged:(id) sender{ detailLabel.text=[NSString stringWithFormat:@"%i", lroundf(slider.value)]; } - (void)dealloc { [super dealloc]; } @end

Compila y ejecuta y tienes una versión perfectamente fina de los controles que querías. Incluso implementé animaciones tan suaves como la mantequilla. ¡Que te diviertas!

EDITAR: si desea utilizar los controles de edición, no debe implementar el siguiente método y debe ajustar el marco de las etiquetas y el control deslizante.

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleNone; }


Siendo un fanático de las bondades, me senté y experimenté un poco. Esto es lo que he encontrado que es la solución más limpia:

Harás una clase de celda personalizada. Cuando leí tu publicación, no tienes ningún problema con esto, y creo que es la única forma.

En el archivo de encabezado:

@interface TableCellSlider : UITableViewCell { UISlider *cellSlider; }

En el archivo principal:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { cellSlider = [[UISlider alloc] initWithFrame:CGRectMake(200, 10, 100, 20)]; [self addSubview:cellSlider]; cellSlider.hidden = YES; } return self; } - (void)didTransitionToState:(UITableViewCellStateMask)state { if (self.editing) { cellSlider.hidden = NO; } else { cellSlider.hidden = YES; } } - (float)getValue { return cellSlider.value; }

En cuanto a la tabla y la altura de la celda, agregue esto a la secuencia de comandos de la tabla:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { [self.tableView beginUpdates]; [super setEditing:editing animated:YES]; [self.tableView endUpdates]; //[self.tableView reloadData]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.editing) { return 50; } else { return 30; } }

Esto debería funcionar. Puede usar getValue en las celdas, por lo que no tiene que sintetizar los controles deslizantes, y se ocultarán o reaparecerán por cualquier motivo que las celdas sean editables.

La mejor de las suertes con su proyecto:]


Solo estoy disparando a ciegas, ya que no lo he implementado solo, pero la tabla de recarga con el nuevo tamaño puede ser útil, puedes sobrescribir, seguir el método mientras estás en modo de edición ...

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return (int)yourHeight; }


necesita reconfigurar su celda en el método delgate llamado

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath

este método se llama cuando el usuario cambia la celda para eliminar

donde puedes encontrar la celda por el método de UITableView

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

y luego reconfigúralo

para obtener más información, consulte la documentación del desarrollador