objective-C-如何在我的表视图中将动态控制对象保留在内存中

问题描述 投票:0回答:4

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS91OGFIWS5wbmcifQ==” alt =“在此处输入图像描述”>

事情是...如果我的屏幕无法显示所有控件,我将使用滚动条浏览我的所有场景,直到一切正常为止,但是...当我这样做时,我所有的控件(标签, textfields)消失!!!!!让我所有的tableviewcell都留空!!

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9CNFptYi5wbmcifQ==” alt =“在此处输入图像描述”>

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9HRndUeS5wbmcifQ==” alt =“在此处输入图像说明”>“ >>

我想这是由于内存不足(内存不足),如何将所有控件(如属性)存储为(强)以使其保持活动状态

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

[我正在用Objective-C开发一个动态应用程序,该应用程序从WebServer解析XML并向我的tableView控制器指定应该打印多少个控件(如标签,文本字段,如...

ios uitableview dynamic-data
4个回答
1
投票

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

您也使用错误的单元格每节每节1个单元格标识符?这根本不重用任何单元格(虽然不错,但是可以更好,按类型排列,等等)


1
投票

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


0
投票

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


0
投票

将把我得到的答案归功于Heavy_Bullets

© www.soinside.com 2019 - 2024. All rights reserved.