0

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

我想这是因为内存问题(弱内存),我怎样才能像属性一样存储我的所有控件(强)以使它们保持活力

注意:我无法控制我的 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;
}
4

4 回答 4

1

因为这与我之前的回答完全不同。我添加一个新的。

你能看看GTScrollViewController 吗?它可能符合您的要求。它支持将 UIView 动态添加到您的 ViewController。但是您仍然需要测试它是否会导致内存问题。请让我知道你的结果。

于 2013-08-22T00:54:46.767 回答
1

这很可能发生,因为您的开关仅创建索引路径 (0,0) 的视图,未创建其他索引路径...

您还使用错误的单元格,每行每节 1 个单元格标识符?这根本没有重用任何单元格(这还不错,但可能会更好,按类型排列等)

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

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

你应该做的是。

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.. 这是你的朋友(或最大的敌人)

于 2013-08-21T01:50:17.360 回答
0

你用ARC吗?您将定义一个强的 NSMutableArray,并将所有动态控制对象添加到该数组中。

于 2013-08-21T01:48:23.553 回答
0

感谢Heavy_Bullets,我会给出我开发的答案

//Sets and returns the contents that will have each row of the table
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    static NSString *cellIdentifier = @"cell";

    UITableViewCell *cell           = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    UIcontrols *object              = [parBusResponseWebServ.controlsList objectAtIndex:indexPath.row];


    if(!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        if ([[object tipoControl] isEqualToString:@"TX"]) {//Control: TextField
            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];

            textfield.delegate = self;

            if (!dictionaryControl) dictionaryControl   = [[NSMutableDictionary alloc]init];

            [dictionaryControl setObject:textfield                  forKey:@"control"];
            [dictionaryControl setObject:@"TextField"               forKey:@"controlType"];
            [dictionaryControl setObject:[object longitudDato]      forKey:@"controlLenght"];
            [dictionaryControl setObject:[object textoValidacion]   forKey:@"controlValidation"];

            if (!self.textFieldArray)   self.textFieldArray = [[NSMutableArray alloc]init];
            [self.textFieldArray addObject:dictionaryControl];

            dictionaryControl = nil;
        }

        if ([[object tipoControl] isEqualToString:@"CB"]) {//Control: Combo

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

            tagControls += 1;

            UITextField *textField = [functions createTextField:@""
                                                       locationX:locationXControl
                                                       locationY:locationYControl
                                                 textFieldlWidth:120
                                                 textFieldHeight:30
                                                    keyboardType:UIKeyboardTypeDefault
                                                 placeholderText:@"Seleccione"
                                                 numTextFieldTag:tagControls
                                             textFieldAdjustment:UIViewAutoresizingFlexibleWidth];
            [textField setEnabled:FALSE];
            [textField setDelegate:self];


            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:textField];
            [cell addSubview:button];

            if (!dictionaryControl) dictionaryControl   = [[NSMutableDictionary alloc]init];

            [dictionaryControl setObject:textField                  forKey:@"control"];
            [dictionaryControl setObject:@"Combo"                   forKey:@"controlType"];
            [dictionaryControl setObject:[object longitudDato]      forKey:@"controlLenght"];
            [dictionaryControl setObject:[object textoValidacion]   forKey:@"controlValidation"];

            if (!self.textFieldArray)   self.textFieldArray = [[NSMutableArray alloc]init];
            [self.comboArray addObject:dictionaryControl];

            locationYControl   += 45;
            locationYLabel     += 45;
        }

        if ([[object tipoControl] isEqualToString:@"TA"]) { //Control: TextArea

            locationYControl     += 30;

            UILabel *label = [functions createLabel:[object 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];
            [textView setDelegate:self];

            tagControls  += 1;

            [cell addSubview:label];
            [cell addSubview:textView];


            if (!dictionaryControl) dictionaryControl   = [[NSMutableDictionary alloc]init];

            [dictionaryControl setObject:textView                   forKey:@"control"];
            [dictionaryControl setObject:@"textArea"                forKey:@"controlType"];
            [dictionaryControl setObject:[object longitudDato]      forKey:@"controlLenght"];
            [dictionaryControl setObject:[object textoValidacion]   forKey:@"controlValidation"];

            if (!self.textAreaArray)   self.textAreaArray = [[NSMutableArray alloc]init];
            [self.textAreaArray addObject:dictionaryControl];

            locationYControl   += 135;
            locationYLabel     += 130;
        }
    }

    return cell;
}
于 2013-08-28T23:41:24.950 回答