gpt4 book ai didi

ios - objective-C - 如何在我的 TableView 中保留内存中的动态控制对象

转载 作者:行者123 更新时间:2023-11-28 22:28:02 25 4
gpt4 key购买 nike

我正在用 objective-C 开发一个动态应用程序,它从 webServer 解析 XML 并向我的 tableView Controller 指定多少控件和哪些控件(标签、文本字段......应该打印,就像一个处方集)

enter image description here

问题是...如果我的屏幕无法显示所有控件,我会使用滚动条浏览我的所有场景,直到那时一切正常但是...当我这样做时,我所有的控件(标签, textfields) dissapear!!! 让我所有的 tableviewcells 都空着!!!

enter image description here

如果我释放滚动条并返回到原始位置(在顶部),我的所有控件都会再次打印,但文本字段中的所有信息都消失了。

enter image description here

我猜这是因为内存的东西(内存力弱),我怎样才能像属性一样(强)存储我所有的控件来让它们保持活力

注意:我无法控制我的 webService 通过 XML 发送的控件的数量和类型...

到目前为止我是这样做的:

@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] <= 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 < [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;
}

最佳答案

这很可能发生,因为您的开关只创建索引路径 (0,0) 的 View ,没有创建其他索引路径...

还有你用错了单元格每行,每节 1 个单元格标识符?这根本不是在重用任何单元格(这还不错,但可以更好,按类型排列等)

好的,我明白了......发生的事情是你只为第一个单元格创建元素......仅为第一个单元格(第0节,第0行)创建每个控件,并将它们添加为 subview 一些偏移量(恰好等于标签高度)这是错误的。

就在第一行不再可见的那一刻,您的所有控件都消失了(请记住它们只是为第一行创建的(它们看起来像是在其他单元格上,但那是因为您将它们粘贴到单元格边界之外...)

你应该做的是。

YourClass *object = [parBusResponseWebServ.controlsList objectAtIndex:indexPath.row];

//With this object you can create the text
if ([[object tipoControl] isEqualToString:@"TX"]) {

UILabel *label = [functions createLabel:[object textoControl]
locationX:locationXLabel
locationY:locationYLabel
labelWidth:widthLabel
labelHeight:30
numLabelTag:tagControls
labelAdjustment:UIViewAutoresizingFlexibleRightMargin];

UITextField *textfield = [functions createTextField:@" "
locationX:locationXControl
locationY:locationYControl
textFieldlWidth:150
textFieldHeight:30
keyboardType:UIKeyboardTypeDefault
placeholderText:[[object requerido] isEqualToString:@"TRUE"] ? @"Requerido***" : @"Introduce Texto"
numTextFieldTag:tagControls
textFieldAdjustment:UIViewAutoresizingFlexibleWidth];

tagControls += 1;

[cell addSubview:label];
[cell addSubview:textfield];

[self.controlsArray addObject:textfield];

}

或者类似的...另外,如果我能说服你接受这种编程方式……你不应该使用标签,而应该使用已经在单元格上的标签

/*Prior to anything, create a NSMutableDictionary to hold the textfields that you are creating*/
self.textFieldDictionary = [[NSMutableDictionary alloc]init];

在 cellForRow 上

//Use only one reuse identifier (much quicker and less memory intensive)
static NSString *reuseIdentifier = @"cell";
UITableViewCell *cell = tableView dequeue....

if(!cell) {
cell = [UITableViewCell alloc]initWithStyle:....

}


//Remove any other textfield
for (UIView *view in cell.contentView.subviews)
[view removeFromSuperview];

cell.textLabel.text = [object textoControl];

/*Recover previously created TEXTFIELD*/
NSString *key = [[NSNumber numberWithInt:indexPath.row]stringValue];
UITextField *textField = [self.textFieldDictionary objectForKey:key];

if(!textField){
textField = /*Create textfield*/
[self.textFieldDictionary setObject:textField forKey:key]
}

[cell.contentView addSubview:textField]

return cell;

这样你就可以每行放置一个元素,而不是所有元素都放在一行上(在这种情况下,如果该行消失,其他元素也会消失)

我给了你最好的答案......我希望你使用 indexPath..它是你的 friend (或最大的敌人)

关于ios - objective-C - 如何在我的 TableView 中保留内存中的动态控制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18347562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com