首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Tableview更新暮光区中的值

Tableview更新暮光区中的值
EN

Stack Overflow用户
提问于 2019-07-24 00:23:35
回答 1查看 32关注 0票数 0

我遵循本教程并成功地将NSTableView绑定到核心数据实体。

该表是一个基于视图的单元格,并从核心数据实体中完美地填充。

我有+-按钮绑定到NSArrayController。当我按下加号按钮时,一个新的记录将被添加到核心数据中并显示在表上,当我选择一个条目并按减号时,该减号将从数据库中删除。因此,我已经为add/remove键重写了此代码。

代码语言:javascript
代码运行次数:0
运行
复制
  @IBAction override func add(_ sender: (Any)?) {
    let newApp = self.newObject() as AnyObject
    newApp.setValue("New Entry", forKey: "name")
    self.addObject(newApp as Any)
  }

  @IBAction override func remove(_ sender: (Any)?) {
    // Do certain stuff before removing all selected rows
    self.remove(atArrangedObjectIndexes: self.tableView!.selectedRowIndexes)
  }

我使表视图单元格可编辑。当按下加号按钮时,将创建一个新条目,并以文本"New“显示在表上。这个新条目创建了一个核心数据记录。我们叫它record 1吧。

现在,我希望用户用他们想要的名称编辑条目。

所以我选择新的单元格,然后按enter键。该单元格现在处于编辑模式。我键入要传递给该单元格的新名称,该名称将传递给核心数据实体。

例如,我输入BONOBO并按ENTER键。

此表必须只包含唯一的名称。因此,一旦按下ENTER并且单元格结束编辑,我想检查核心数据,看看名称BONOBO是否已经被接受,如果是,拒绝名称并告诉用户提供一个新的名称。

这就是问题所在:一旦我按ENTER键,record 1立即将其名称从New Entry更改为BONOBO,然后才能检查数据库中是否已经存在该条目,这意味着我所做的任何检查都会告诉我该记录是存在的。事实上,由于上下文尚未保存,因此记录存在于内存中。

我通过将所有单元格的委托设置为一个类并使用它的委托方法controlTextDidEndEditing(_ obj: Notification)来拦截enter按下。

我也尝试为文本字段设置一个操作,但问题是相同的。

如何在核心数据更改发生之前拦截它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-24 03:46:51

这里的诀窍是利用键值编码的内置验证方法。见对象验证

我从未在托管对象中这样做过,但这个过程似乎与常规的KVC验证过程相同。您希望实现一个名称为:

代码语言:javascript
代码运行次数:0
运行
复制
validate<Key>:error:

..。其中'Key‘是您要验证的参数的名称。这将接受要验证的值的指针,以及NSError对象的指针。在该方法中,您将测试传入值是否可接受。您可以返回true以接受它,修改值并返回true以接受修改后的版本,或者返回false以直接拒绝它(修改error对象以使其返回给用户)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57173725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档