Use UITableViewCellDeleteConfirmationControl para saber cuál es la subvista de la celda actual

¿Está bien usar UITableViewCellDeleteConfirmationControl de esta manera:

- (void)layoutSubviews { [super layoutSubviews]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:0.0f]; for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { CGRect newFrame = subview.frame; newFrame.origin.x = 200; subview.frame = newFrame; } else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]) { CGRect newFrame = subview.frame; newFrame.origin.x = 100; subview.frame = newFrame; } else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellReorderControl"]) { CGRect newFrame = subview.frame; newFrame.origin.x = 200; subview.frame = newFrame; } } [UIView commitAnimations]; } 

¿Aunque UITableViewCellDeleteConfirmationControl no es una class pública?

Dado que está comparando la igualdad de cadenas, no está exponiendo ninguna API privada y, por lo tanto, debería ser elegible para la presentación de AppStore.

He podido utilizar con éxito esta comprobación de igualdad en mi propia aplicación que llegó a la AppStore.

Primero, una class no es una cadena. Debe usar NSStringFromClass([subview class]) para get una representación de cadena del nombre de class.

Segundo, tener el nombre completo de la class como una cadena literal es un gran riesgo, y no debería ser tan obvio. Por ejemplo, podrías probar si el nombre contiene una parte del nombre que estás buscando: [className rangeOfSubstring:@"DeleteConfirmation"].location != NSNotFound .

Tercero, la razón por la que esto no está expuesto es porque es una implementación privada de celdas de tabla. Un buen ejemplo de por qué no debería estar en iOS7, la implementación completa de las celdas se ha cambiado por completo. Las classs que mencionas en tu ejemplo ya no se usan.