代码之家  ›  专栏  ›  技术社区  ›  Andy

当用户完成在不稳定视图中编辑单元格时,如何获得通知?

  •  5
  • Andy  · 技术社区  · 16 年前

    我需要知道用户何时完成在不稳定视图中编辑单元格。该表包含用户的所有日历(从CalcalEndarStore获取),因此为了保存用户的更改,我需要将更改通知CalcalEndarStore。但是,我找不到任何在用户完成编辑后被调用的东西-我想在表的委托中会有一个方法,但是我只看到一个在编辑开始时被调用的方法,而不是在编辑结束时。

    7 回复  |  直到 7 年前
        1
  •  2
  •   Nathan Kinsinger    16 年前

    子类InstableView和重写textDindediting:(确保调用super的实现)。

    这只能由文本字段nstextfieldsell或nscomboboxcell调用(但仅当通过键入值而不是从组合菜单中选择值来更改值时)。

        2
  •  14
  •   Alessandro Vendruscolo    11 年前

    您可以在不进行子类化的情况下获得相同的结果。 NSTableView 通过使用 NSNotificationCenter 或使用 NSControl 方法。请参见以下苹果文档:

    http://developer.apple.com/library/mac/#qa/qa1551/_index.html

    这只是几行代码,非常适合我。


    如果你能成为 delegate 非稳定视图 你只需要实现这个方法

    - (void)controlTextDidEndEditing:(NSNotification *)obj { ... }
    

    事实上, 非稳定视图 代表 NSCORM 它包含的元素,并将这些方法调用转发到它的 代表 (还有其他有用的方法)

    否则,使用 通知中间 :

    // where you instantiate the table view
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:)
        name:NSControlTextDidEndEditingNotification object:nil];
    
    // somewhere else in the .m file
    - (void)editingDidEnd:(NSNotification *)notification { ... }
    
    // remove the observer in the dealloc
    - (void)dealloc {
       [[NSNotificationCenter defaultCenter] removeObserver:self
        name:NSControlTextDidEndEditingNotification object:nil];
       [super dealloc]
    }
    
        3
  •  2
  •   Nathan Kinsinger    16 年前

    使用addObserver:ToObjectSatindexes:ForkeyPath:Options:Context为内容数组中的每个项设置观察器:

    您还需要为数组本身设置一个观察者,这样您将收到关于添加到数组或从数组中删除的对象的通知。

    例如,请看 iSpend 项目。

        4
  •  1
  •   Lounges    16 年前

    研究instabledatasource协议。您要查找的消息称为:TableView:SetObjectValue:FortableColumn:Row:

        5
  •  1
  •   Andy    16 年前

    在我的情况下,这似乎行不通。我将控制器类设置为表的数据源,但从未调用该方法。数据是我的表绑定到NSarrayController中的值-这就是为什么我的对象没有被调用的原因吗?

        6
  •  0
  •   J.beenie    7 年前

    将@milly的答案翻译成 斯威夫特3 :

    // Setup editing completion notifications
    NotificationCenter.default.addObserver(self, selector: #selector(editingDidEnd(_:)), name: NSNotification.Name.NSControlTextDidEndEditing, object: nil)
    

    处理通知的函数:

    func editingDidEnd(_ obj: Notification) {
        guard let newName = (obj.object as? NSTextField)?.stringValue else {
            return
        }
    
        // post editing logic goes here
    }
    
        7
  •  -1
  •   Nathan Kinsinger    16 年前

    子类nsarraycontroller并重写objectDindediting:(确保调用super的实现)。

    这主要只能由文本字段nstextfieldsell或nscomboboboxcell调用(但仅当通过键入值而不是从组合菜单中选择值来更改值时)。可能还有其他一些单元格会调用它,但我不确定是哪个单元格。如果您有一个自定义单元,那么考虑实现NSeditor和NSeditor注册非正式协议。