【问题标题】:How to refresh UITextField within UITableViewCell after data selection from modal从模态选择数据后如何在 UITableViewCell 中刷新 UITextField
【发布时间】:2012-03-13 17:22:25
【问题描述】:

我有一个带有 UITextFields 的表格视图来构建一个表单。然后我在工具栏中有一个按钮,它启动一个模式视图控制器来选择一些数据,然后将这些数据传递回 tableview。但是,选择的新数据不会使用 textField.text = valueReturnedFromModal 语法刷新到 UITextField 中。我有什么遗漏吗?

我看到数据正在从模式中正确返回,所以这不是问题。我只是无法强制 UITextField 用新数据刷新。我也尝试在 tableview 上强制 reloadData。

所以从模态视图来看,这里是传回数据的代码:

- (void)doneAccountSelection:(id)sender
{
    [delegate didSelectAccount:currentAccount];
    [self dismissModalViewControllerAnimated:YES];
}

这是委托中的实际方法:

- (void)didSelectAccount:(SFAccount *)selectedAccount
{
    //Ensure a valid deal exists for the account to be attached to
    [self createDealObjectIfNeeded];

    //Set the deal account
    [self.deal setAccount:selectedAccount];

    //Refresh the text fields
    //Tag 3: Account Name field
    UITextField *acct_name = (UITextField *) [self.view viewWithTag:3];
    [acct_name setText:self.deal.account.field_acct_name_value];

    //Tag 4: Account City field
    UITextField *acct_city = (UITextField *) [self.view viewWithTag:4];
    [acct_city setText:self.deal.account.field_acct_city_value];

    //Save the context changes. A new deal gets created above if one does not exist.
    if ([self saveModel]) NSLog(@"Acct object created, attached to deal successfully!");

    [self.tableView reloadData];
}

【问题讨论】:

    标签: ios uitableview uitextfield modalviewcontroller


    【解决方案1】:

    您介意发布设置文本字段数据的代码以及将数据传递回表格视图的代码吗?

    答案:

    您似乎正确设置了数据,但是,您在发送委托消息后关闭了模态视图控制器。在这种情况下,直到dismissModalViewControllerAnimated: 结束后才创建表视图。这意味着在视图出现之前,文本字段为 NULL。我的建议是打电话

    [self dismissModalViewControllerAnimated:YES];
    

    作为 didSelectAccount: 委托方法的第一行。这将关闭模态视图,然后继续将数据设置为有效的文本字段,因为 -viewWillAppear: / -viewDidAppear: 已经被调用。一切似乎都很好,只是可能会绊倒你的顺序。虽然

    -dismissModalViewControllerAnimated:
    

    如果视图控制器没有模态视图(因为它是模态视图),则将其传递给其父级,在委托方法中调用此方法似乎更合适,您最终将在新数据中操作视图等。

    【讨论】:

    • 布莱恩,我试过你推荐的。我将[self dismissModalViewControllerAnimated:YES]; 移动到didSelectAccount: 方法的开头,但没有成功。
    • 你有方法-createDealObjectIfNeeded。这是设置self的deal属性吗?如果不是,那代码在哪里?
    • case 1: if (indexPath.row == 0) { cell.lblFieldName.text = @"Name"; if (account) cell.txtFieldValue.text = account.field_acct_name_value; cell.txtFieldValue.tag = 3; } if (indexPath.row == 1) { cell.lblFieldName.text = @"City"; if (account) cell.txtFieldValue.text = account.field_acct_city_value; cell.txtFieldValue.tag = 4; } break;
    • createDealObjectIfNeeded: 的作用如下:- (void)createDealObjectIfNeeded { //If no deal object exists, create the deal object first if (self.deal == nil) { SFDeal *d = [NSEntityDescription insertNewObjectForEntityForName:@"SFDeal" inManagedObjectContext:moc]; self.deal = d; //Set demo data and deleted flags to identify new deals as 'real' data [self.deal setDemoDataFlag:[NSNumber numberWithInt:0]]; [self.deal setDeletedFlag:[NSNumber numberWithInt:0]]; } }
    • 你指的是[self.view viewWithTag: number];什么时候真的不是 UITableViewCell 的文本字段部分?
    【解决方案2】:

    在文本字段中获取值后使用它:

    [self.tableView ReloadData];
    

    【讨论】:

    • 如果我正确理解了您的答案,那么文本字段不会启动模态视图,因此这将不起作用。模态视图将数据返回给 tableviewcontroller 中的委托方法,在该函数中,我需要更新文本字段中的文本。
    【解决方案3】:

    经过一些认真的调试发现self.account 被用于cellForRowAtIndexPath 来设置UITableViewCell 中的初始UITextField 值。然后在模式选择完成后,我只更新了交易对象的帐户引用,而不更新self.account 对象。

    然后我通过创建一个名为updateTextFieldsAfterModalFinished 的新方法添加到此,并移动代码以更新那里的UITextFields。然后从didSelectAccount 调用此方法,这是被解除的模态视图的委托方法。事情现在按预期工作,UITextFields 在模式选择完成后得到更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      相关资源
      最近更新 更多