ios中滚动时UITableviewCell显示不正确

ios中滚动时UITableviewCell显示不正确,ios,uitableview,Ios,Uitableview,我有一个表格视图,需要在其中显示一些问题文本及其答案类型。答案类型可以是UISwitch(单选项)、UITextField(文本选项)和星形评级视图(星形选项)。所有问题及其答案类型均来自服务器。因此,对于每个表格行,我需要显示一个问题文本和一个答案类型,正如我在下面的屏幕截图中提到的。可以有n个问题,所以我根据问题的数量设置了它们的框架。现在,我的问题是当我向上或向下滚动时,问题显示正确,但是他们的答案类型是随机的,而且我没有得到正确的单元格高度 请检查,我正在附上我的代码 -(void)t

我有一个表格视图,需要在其中显示一些问题文本及其答案类型。答案类型可以是UISwitch(单选项)、UITextField(文本选项)和星形评级视图(星形选项)。所有问题及其答案类型均来自服务器。因此,对于每个表格行,我需要显示一个问题文本和一个答案类型,正如我在下面的屏幕截图中提到的。可以有n个问题,所以我根据问题的数量设置了它们的框架。现在,我的问题是当我向上或向下滚动时,问题显示正确,但是他们的答案类型是随机的,而且我没有得到正确的单元格高度

请检查,我正在附上我的代码

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        Surveys *surveys = [[Surveys alloc] init];
        surveys = [arraySurveys objectAtIndex:indexPath.row];
        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *surveysCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!surveysCell) {
            surveysCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

            UILabel *lblSurveyQuestionText = nil;
            SVSegmentedControl *segment1 = nil;
            UITextField *tfAnswer = nil;

            //For displaying Voting Questions
            lblSurveyQuestionText = [[UILabel alloc] init];
            labelHeight = [self getLabelHeightForIndex:indexPath.row];

            lblSurveyQuestionText.frame = CGRectMake(10, 5, 300,labelHeight);

            lblSurveyQuestionText.backgroundColor = [UIColor clearColor];
            lblSurveyQuestionText.text = surveys.questions;
            lblSurveyQuestionText.textAlignment = NSTextAlignmentLeft;
            lblSurveyQuestionText.lineBreakMode = NSLineBreakByWordWrapping;
            lblSurveyQuestionText.numberOfLines = 0;
            lblSurveyQuestionText.tag = 10;
            [lblSurveyQuestionText sizeToFit];
            lblSurveyQuestionText.textColor = [UIColor whiteColor];

            [surveysCell.contentView addSubview:lblSurveyQuestionText];

            //For displaying UISwitch
            NSArray *arrayOption1 = [[NSArray alloc] initWithObjects:@"Yes", @"No", nil];
            segment1 = [[SVSegmentedControl alloc] initWithSectionTitles:arrayOption1];

            segment1.thumb.tintColor = [UIColor colorWithRed:0.6 green:0.2 blue:0.2 alpha:1];

            segment1.changeHandler = ^(NSUInteger newIndex) {
                NSString *selectedName = [arrayOption1 objectAtIndex:newIndex];
                NSLog(@"Switch selected answer is = %@", selectedName);
            };

            segment1.center = CGPointMake(65, lblSurveyQuestionText.frame.size.height+27);

            //For displaying text field
            tfAnswer = [[UITextField alloc] init];
            CGRect frameRect = CGRectMake(10, lblSurveyQuestionText.frame.size.height+13, 300, 25);
            frameRect.size.height = 25;
            tfAnswer.frame = frameRect;

            UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 7, 10)];
            tfAnswer.leftView = paddingView;
            tfAnswer.leftViewMode = UITextFieldViewModeAlways;
            tfAnswer.textColor = [UIColor colorWithRed:(59/255.0) green:(59/255.0) blue:(59/255.0) alpha:1.0];
            tfAnswer.delegate = self;
            tfAnswer.font = [UIFont fontWithName:@"Helvetica Neue Medium" size:16.0];
            tfAnswer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"tf_301_23.png"]];\
            tfAnswer.returnKeyType = UIReturnKeyDone;

            //For displaying star view
            starRatingAnswer = [[TQStarRatingView alloc] initWithFrame:CGRectMake(10, lblSurveyQuestionText.frame.size.height+10, 180, 30) numberOfStar:5];
            starRatingAnswer.delegate = self;

            surveysCell.selectionStyle = UITableViewCellSelectionStyleNone;
            tblSurveys.tableFooterView = viewSurveysBottom;

            NSLog(@"Surveys answer type is = %@", surveys.answer_type);

            if ([surveys.answer_type isEqualToString:@"text_option"]) {

                [surveysCell.contentView addSubview:tfAnswer];
            }
            else if ([surveys.answer_type isEqualToString:@"single_option"]) {

                [surveysCell.contentView addSubview:segment1];
            }
            else{

                [surveysCell.contentView addSubview:starRatingAnswer];
            }
            return surveysCell;

        }

        ((UILabel *)[surveysCell.contentView viewWithTag:10]).text = surveys.questions;
        return surveysCell;
}
JSON:

{
    "Question_sq_details": [
        {
            "event_sq_qns_id": 3,
            "questions": "Effectiveness of the speakers",
            "answer_type": "star_option"
        },
        {
            "event_sq_qns_id": 4,
            "questions": "What is your primary job title/focus? Please select one.",
            "answer_type": "single_option"
        },
        {
            "event_sq_qns_id": 5,
            "questions": "Quality of the content",
            "answer_type": "star_option"
        },
        {
            "event_sq_qns_id": 6,
            "questions": "Usefulness of the Solutions Showcase",
            "answer_type": "text_option"
        },
        {
            "event_sq_qns_id": 7,
            "questions": "Relevance of the Solutions Showcase to your business",
            "answer_type": "star_option"
        },
        {
            "event_sq_qns_id": 8,
            "questions": "Relevance of the topics to your business",
            "answer_type": "star_option"
        },
        {
            "event_sq_qns_id": 9,
            "questions": "General Comments",
            "answer_type": "text_option"
        }
    ]
}
请建议一些克服这种情况的方法。我已经尝试了很多,但是使用上面的代码似乎没有任何效果


谢谢。

您有三种类型的电池,请以不同方式处理。 不要忘记使用预处理器宏而不是普通的数字作为
tag
s

#define lblSurveyQuestionTextTag 10
顺便说一句,我更喜欢将UITableViewCell子类化,而不是像这样搞砸

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Surveys *surveys = [[Surveys alloc] init];
    surveys = [arraySurveys objectAtIndex:indexPath.row];

    // differenct identifiers based on different type of cells
    static NSString *CellIdentifier = surveys.answer_type;

     UITableViewCell *surveysCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
     if (!surveysCell) {
        // Setup shared property
         surveysCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
         surveysCell.selectionStyle = UITableViewCellSelectionStyleNone;
        tblSurveys.tableFooterView = viewSurveysBottom;

        UILabel *lblSurveyQuestionText = nil;

        //For displaying Voting Questions
        lblSurveyQuestionText = [[UILabel alloc] init];
        labelHeight = [self getLabelHeightForIndex:indexPath.row];

        lblSurveyQuestionText.frame = CGRectMake(10, 5, 300,labelHeight);

        lblSurveyQuestionText.backgroundColor = [UIColor clearColor];
        lblSurveyQuestionText.text = surveys.questions;
        lblSurveyQuestionText.textAlignment = NSTextAlignmentLeft;
        lblSurveyQuestionText.lineBreakMode = NSLineBreakByWordWrapping;
        lblSurveyQuestionText.numberOfLines = 0;
        lblSurveyQuestionText.tag = 10;
        [lblSurveyQuestionText sizeToFit];
        lblSurveyQuestionText.textColor = [UIColor whiteColor];

        [surveysCell.contentView addSubview:lblSurveyQuestionText];

        // end setup shared properties

        if ([surveys.answer_type isEqualToString:@"text_option"]) { // setup text_option type
        //For displaying text field
            UITextField *tfAnswer = [[UITextField alloc] init];
            CGRect frameRect = CGRectMake(10, lblSurveyQuestionText.frame.size.height+13, 300, 25);
            frameRect.size.height = 25;
            tfAnswer.frame = frameRect;

            UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 7, 10)];
            tfAnswer.leftView = paddingView;
            tfAnswer.leftViewMode = UITextFieldViewModeAlways;
            tfAnswer.textColor = [UIColor colorWithRed:(59/255.0) green:(59/255.0) blue:(59/255.0) alpha:1.0];
            tfAnswer.delegate = self;
            tfAnswer.font = [UIFont fontWithName:@"Helvetica Neue Medium" size:16.0];
            tfAnswer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"tf_301_23.png"]];\
            tfAnswer.returnKeyType = UIReturnKeyDone;
            tfAnswer.tag = 2555;
            [surveysCell.contentView addSubview:tfAnswer];
        }
        else if ([surveys.answer_type isEqualToString:@"single_option"]) { // setup single_option type
            //For displaying UISwitch
            NSArray *arrayOption1 = [[NSArray alloc] initWithObjects:@"Yes", @"No", nil];
            SVSegmentedControl *segment1 = [[SVSegmentedControl alloc] initWithSectionTitles:arrayOption1];

            segment1.thumb.tintColor = [UIColor colorWithRed:0.6 green:0.2 blue:0.2 alpha:1];

            segment1.center = CGPointMake(65, lblSurveyQuestionText.frame.size.height+27);

            segment1.changeHandler = ^(NSUInteger newIndex) {
            NSString *selectedName = [arrayOption1 objectAtIndex:newIndex];
            NSLog(@"Switch selected answer is = %@", selectedName);
        };

        segment1.tag = 2556;
        [surveysCell.contentView addSubview:segment1];
    }
    else{ // setup star type
        //For displaying star view
        /* TQStarRatingView * */starRatingAnswer = [[TQStarRatingView alloc] initWithFrame:CGRectMake(10, lblSurveyQuestionText.frame.size.height+10, 180, 30) numberOfStar:5];
        starRatingAnswer.delegate = self;
        starRatingAnswer.tag = 2557;
        [surveysCell.contentView addSubview:starRatingAnswer];
        }
    }

    if ([surveys.answer_type isEqualToString:@"text_option"]) {
        UITextField *tfAnswer = (UITextField*)[surveysCell.contentView viewWithTag:2555];
        // tfAnswer.text = @""
    }
    else if ([surveys.answer_type isEqualToString:@"single_option"]) {
        SVSegmentedControl *segment1 = (SVSegmentedControl*)[surveysCell.contentView viewWithTag:2556];
        // segment1.selectedIndex = 1;
    }
    else{
        TQStarRatingView *starRatingAnswer = (TQStarRatingView*)[surveysCell.contentView viewWithTag:2557];
        // starRatingAnswer.stars = 5;
    }

    // NSlog cause performance loss in TableView, turn it off when not needed or release/adhoc builds
    NSLog(@"Surveys answer type is = %@", surveys.answer_type);

    ((UILabel *)[surveysCell.contentView viewWithTag:10]).text = surveys.questions;
    return surveysCell;
}

用这个来表达对你的希望。非常感谢@Anbu.Karthik。现在它可以工作了。但是你能告诉我怎样才能把他们所有的答案都保存下来吗。。我需要将他们的答案发送回服务器?你能清楚地说出你需要的答案吗好的..假设我在表格单元格中显示三个答案类型为UITextfield的问题。所以一旦用户给出答案。。我需要按行正确保存所有答案表。正确保存意味着您需要将数据发送到服务器或将问题与答案对齐