Note that there are some explanatory texts on larger screens.

plurals
  1. POobjective-C - How to keep in memory dynamic control objects in my tableview
    text
    copied!<p>I'm developing a dinamic app in objective-C which parses from a webServer an XML and specifies to my tableView controller how many and which controls (labels, textfields... should print, like a formulary) </p> <p><img src="https://i.stack.imgur.com/u8aHY.png" alt="enter image description here"></p> <p>The thing is... if my screen can't show all the controls, I use the scroll to navigate through all my scene, til then everything is okay but... When I do that, all my controls (labels, textfields) dissapear!!!Leaving all my tableviewcells empty!!!</p> <p><img src="https://i.stack.imgur.com/B4Zmb.png" alt="enter image description here"></p> <p>If I release the scroll and gets back to original position (on top), all my controls are printed again, but all the information inside textfields is gone.</p> <p><img src="https://i.stack.imgur.com/GFwTy.png" alt="enter image description here"></p> <p>I guess it is because of a memory thing (weak memory), how can I store all my controls with (strong) like a property to keep them alive</p> <p>Note: I can't control the amount and type of controls that my webService sends throught the XML...</p> <p>this is how I do so far:</p> <pre><code>@property (nonatomic, strong) NSMutableArray *controlsArray; @property (nonatomic, strong) UITableView *myTableView; - (void)viewDidLoad { [super viewDidLoad]; if ([[UIDevice currentDevice].model hasPrefix:@"iPhone"]){ locationXLabel = 20; locationXControl = 150; widthLabel = 130; } if ([[UIDevice currentDevice].model hasPrefix:@"iPad"]){ locationXLabel = 65; locationXControl = 250; widthLabel = 190; } locationYLabel = 10; locationYControl = 15; //WebService for printing controls if (!parBusResponseWebServ) parBusResponseWebServ = [[ParBusResponseWS alloc]imprimePantallaBusqueda]; while ([parBusResponseWebServ transacWebServCompleto] == Nil) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } //if webservice loads incomplete sends this message and exit if ([[parBusResponseWebServ transacWebServCompleto] isEqualToString:@"FALSE"] || [[parBusResponseWebServ controlsList] count] &lt;= 0) { parBusResponseWebServ = Nil; return; } self.controlsArray = [[NSMutableArray alloc]init]; self.title = @"Búsqueda"; if (!functions) functions = [[Functions alloc]init]; [self createTableView]; } -(void)createTableView{ //this instance, creates, sets as a delegate and displays tableview self.myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)style:UITableViewStyleGrouped]; self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; self.myTableView.backgroundView = nil; self.myTableView.backgroundColor = UIColorFromRGB(tableViewBackgroundColor); self.myTableView.separatorColor = UIColorFromRGB(tableViewSeparatorColor); self.myTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLineEtched; self.myTableView.delegate = self; self.myTableView.dataSource = self; [self.view addSubview:self.myTableView]; } //Sets and returns the contents that will have each row of the table - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellIdentifier = [NSString stringWithFormat:@"s%i-r%i", indexPath.section, indexPath.row]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; cell.selectionStyle = UITableViewCellSelectionStyleNone; switch (indexPath.section) { case 0: { switch (indexPath.row) { case 0:{ for (int i = 0; i &lt; [parBusResponseWebServ.controlsList count]; i++) { if ([[[parBusResponseWebServ.controlsList objectAtIndex:i]tipoControl] isEqualToString:@"TX"]) { UILabel *label = [functions createLabel:[[parBusResponseWebServ.controlsList objectAtIndex:i] textoControl] locationX:locationXLabel locationY:locationYLabel labelWidth:widthLabel labelHeight:30 numLabelTag:tagControls labelAdjustment:UIViewAutoresizingFlexibleRightMargin]; tagControls += 1; UITextField *textfield = [functions createTextField:@" " locationX:locationXControl locationY:locationYControl textFieldlWidth:150 textFieldHeight:30 keyboardType:UIKeyboardTypeDefault placeholderText:[[[parBusResponseWebServ.controlsList objectAtIndex:i]requerido] isEqualToString:@"TRUE"] ? @"Requerido***" : @"Introduce Texto" numTextFieldTag:tagControls textFieldAdjustment:UIViewAutoresizingFlexibleWidth]; tagControls += 1; [cell addSubview:label]; [cell addSubview:textfield]; [self.controlsArray addObject:textfield]; locationYControl += 45; locationYLabel += 45; } if ([[[parBusResponseWebServ.controlsList objectAtIndex:i]tipoControl] isEqualToString:@"CB"]) { UILabel *label = [functions createLabel:[[parBusResponseWebServ.controlsList objectAtIndex:i] textoControl] locationX:locationXLabel locationY:locationYLabel labelWidth:widthLabel labelHeight:30 numLabelTag:tagControls labelAdjustment:UIViewAutoresizingFlexibleRightMargin]; tagControls += 1; UITextField *campotexto = [functions createTextField:@" " locationX:locationXControl locationY:locationYControl textFieldlWidth:120 textFieldHeight:30 keyboardType:UIKeyboardTypeDefault placeholderText:@"Seleccione" numTextFieldTag:tagControls textFieldAdjustment:UIViewAutoresizingFlexibleWidth]; tagControls += 1; UIButton *button =[functions createButton:@" " locationX:270 locationY:locationYLabel buttonWidth:30 buttonHeight:30 buttonType:UIButtonTypeDetailDisclosure numButtonTag:tagControls buttonAdjustment:UIViewAutoresizingFlexibleLeftMargin]; [button addTarget:self action:@selector(action) forControlEvents:(UIControlEvents)UIControlEventTouchUpInside]; [cell addSubview:label]; [cell addSubview:campotexto]; [cell addSubview:button]; [self.controlsArray addObject:campotexto]; locationYControl += 45; locationYLabel += 45; } if ([[[parBusResponseWebServ.controlsList objectAtIndex:i]tipoControl] isEqualToString:@"TA"]){ locationYControl += 30; UILabel *label = [functions createLabel:[[parBusResponseWebServ.controlsList objectAtIndex:i] textoControl] locationX:locationXLabel locationY:locationYLabel labelWidth:widthLabel labelHeight:30 numLabelTag:tagControls labelAdjustment:UIViewAutoresizingFlexibleRightMargin]; tagControls += 1; UITextView *textView = [functions createTextArea:@" " locationX:locationXLabel locationY:locationYControl textViewlWidth:280 textViewHeight:70 keyboardType:UIKeyboardTypeDefault numTextViewTag:tagControls textViewAdjustment:UIViewAutoresizingFlexibleRightMargin]; tagControls += 1; [cell addSubview:label]; [cell addSubview:textView]; [self.controlsArray addObject:textView]; locationYControl += 135; locationYLabel += 130; } } } break; default: break; } break; default: break; } } } return cell; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload