Si bien es natural ponerlo en la ContentView de la celda, estoy bastante seguro de que ese no es el problema (en realidad, en el pasado, nunca tuve las subvistas visualizadas correctamente en ContentView, así que siempre usé la celda).
De todos modos, el problema involucra las tres primeras líneas de cuando comienza a crear su botón. Las dos primeras líneas están muy bien, pero el código deja de trabajar con:
scanQRCodeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
buttonWithType: es en realidad un método de conveniencia de crear un botón (que es como un alloc-init compacto). Por lo tanto, en realidad "anula" sus últimas dos líneas (básicamente creó el botón dos veces). Solo puede usar init o buttonWithType: para el mismo botón, pero no para ambos.
UIButton *scanQRCodeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
scanQRCodeButton.frame = CGRectMake(0.0f, 5.0f, 320.0f, 44.0f);
scanQRCodeButton.backgroundColor = [UIColor redColor];
[scanQRCodeButton setTitle:@"Hello" forState:UIControlStateNormal];
[cell addSubview:scanQRCodeButton];
Esto funcionará (tenga en cuenta que puede usar cell.contentView si lo desea). En caso de que no esté utilizando el conteo automático de referencias (ARC), me gustaría mencionar que no tiene que hacer nada en términos de administración de memoria, porque buttonWithType: devuelve un botón de autorretractado.
Después de añadir '[cell.contentView addSubview: scanQRCodeButton];' también se puede soltar el botón '[liberación scanQRCodeButton];' – elprl
* Si no está utilizando ARC – elprl