字典每次都被分配

时间:2017-10-17 07:43:53

标签: objective-c swift uitableview nsdictionary

我有两个观点。在第一课我有自定义单元格的表,在那里重新使用单元格三次。我想用另一个类中的选定文本更新每一行的表格单元格文本。我已经实现了protocol来从另一个类获取文本值并进行更新。用于使用NSDictionary存储每个行值。这样我就可以获取字典值并在cellforrowatindexpath中更新以更新单元格文本值。我的代码,

A类 - 目标C:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"challengeTableCell";
    cell = (EnrollmentChallengeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
    cell = [[EnrollmentChallengeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

cell.answerTextfield.delegate = self;

if (indexPath.row == 0) {
    cell.questionTitleLabel.text = @"Challenge Question 1";
    cell.questionLabel.tag = 100;
    cell.questionLabel.textColor = [UIColor blackColor];
    NSString *user1 = [myDict objectForKey:@"firstQuestion"];
    NSLog(@"firstquestion: %@",user1);
}
else if (indexPath.row == 1) {
    cell.questionTitleLabel.text = @"Challenge Question 2";
    cell.questionLabel.tag = 101;
    NSString *user2 = [myDict objectForKey:@"secondQuestion"];
    NSLog(@"secondQuestion: %@",user2);

}
else {
    cell.questionTitleLabel.text = @"Challenge Question 3";
    cell.questionLabel.tag = 102;
    NSString *user3 = [myDict objectForKey:@"thirdQuestion"];
    NSLog(@"thirdQuestion: %@",user3);
}

if (cell.questionLabel.tag == 100 || cell.questionLabel.tag == 101 || cell.questionLabel.tag == 102) {
    UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectQuestion:)];
    [cell.questionLabel setUserInteractionEnabled:YES];
    [cell.questionLabel addGestureRecognizer:gesture];
}

    return cell;
}

-(void)selectQuestion:(UITapGestureRecognizer *) sender
{
    CGPoint touchLocation = [sender locationOfTouch:0 inView:challengeQuestionsTable];
    newIndexPath = [challengeQuestionsTable indexPathForRowAtPoint:touchLocation];
    selectQuestionVC = [EnrollmentSelectQuestionViewController instantiate];
    selectQuestionVC.questionDelegate = self;
    [self presentViewController:selectQuestionVC animated:YES completion:nil];
}

#pragma mark - Table Selection Delegate

-(void)valueChanged:(NSString *)questionString {
    //[challengeQuestionsTable reloadRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
    passedValue = questionString;
    NSLog(@"questionvalue: %@",passedValue);
    NSLog(@"mydict: %lu",(unsigned long)[myDict count]);
    cell = [challengeQuestionsTable cellForRowAtIndexPath:newIndexPath];
    NSLog(@"you have selected index: %ld", (long)newIndexPath.row);
    [[NSUserDefaults standardUserDefaults] setInteger:newIndexPath.row forKey:@"SelectedIndex"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    //    NSInteger numberOfRows = [challengeQuestionsTable numberOfRowsInSection:[indexPath section]];
    NSLog(@"indexpath row: %ld",newIndexPath.row);

    if (newIndexPath.row == 0) {
        [myDict setValue:passedValue forKey:@"firstQuestion"];
    } else if (newIndexPath.row == 1) {
        [myDict setValue:passedValue forKey:@"secondQuestion"];
    } else {
        [myDict setValue:passedValue forKey:@"thirdQuestion"];
  }

  NSLog(@"mydict: %@",myDict);
  NSLog(@"1st: %@",[myDict objectForKey:@"firstQuestion"]);
  NSLog(@"2nd: %@",[myDict objectForKey:@"secondQuestion"]);
  NSLog(@"3rd: %@",[myDict objectForKey:@"thirdQuestion"]);
}

B级 - 斯威夫特:

var questionDelegate: SelectedQuestionDelegate?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    print("selected index :",indexPath.row)

    let selectedCell = tableView.cellForRow(at: indexPath)
    print("did select and the text is \(selectedCell?.textLabel?.text)")
    let storyboard = UIStoryboard(name: "EnrollmentChallengeQuestions", bundle: nil)
    challengeVC = storyboard.instantiateViewController(withIdentifier: "ChallengeQuestions") as! EnrollmentChallengeQuestionsViewController
    challengeVC.passedValue = selectedCell?.textLabel?.text
    print("text label value: ", challengeVC.passedValue)
    questionDelegate?.valueChanged(challengeVC.passedValue)
    self.present(challengeVC, animated: true , completion: nil)
}

ValueChanged函数中,我的字典一次只能保存一个值。我想保留第一行的第一个问题,第二行的第二个问题和第三个问题。我的字典每次都会刷新。还尝试在viewdidload&中分配我的词典。 viewwillappear。所有方法在来自另一个类时再次被调用。如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

我认为您需要使用dismiss(animated: true, completion: nil)代替self.present(challengeVC, animated: true , completion: nil)

目前,当您选择一个问题时,再次显示challengeVC,以便再次调用其viewDidLoadviewWillAppear方法,从而再次分配您的字典