Keary, Ok, I finally found [control abortEditing]. Why I never saw this to begin with is embarrassing to say the least. In my textShouldEndEditing, I perform my logic, aborting if need be. As the control retains the text I last entered before I abort, I force the NSArrayController to reselect its current selection, basically to setSelectedObjects:nil, then setSelectedObjects:previouslySelectedObjects. This flushes what I typed in the control and sets the control to whatever text it should display based on its selection.
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor{ if ([myDocument countOfSelectedObjects] > 1) { int result = NSRunAlertPanel(@"Multiple Thingies Selected", @"Do you want to make changes to all of these thingies?", @"OK", nil, @"Cancel"); if (result == NSAlertOtherReturn) { [control abortEditing]; [myDocument performSelector:@selector(reselectCurrentSelection) withObject:nil afterDelay:0.1]; return NO; } } return YES; } On Jan 3, 2013, at 9:18 PM, Keary Suska wrote: > On Jan 3, 2013, at 3:53 PM, Patrick Cusack wrote: > >> Keary, >> >> I am checking whether or not the user is trying to edit multiple items in my >> delegate's - (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText >> *)fieldEditor >> >> If the choose to not complete editing, I should be able to discard editing >> on the bound NSArrayController, but my control still has focus after calling >> discardEditing. > > Yes--discard/commit editing does only that--it won't change focus/first > responder as that is the responsibility of the window, IIRC. You will have to > decide what to do next, as you are interrupting the "normal" flow of events. > What you do depends on the user experience you want. You could call [window > makeFirstResponder:[[window firstResponder] nextResponder]], which should > work predictably if you have set the next responder for all applicable > editable controls. Alternatively you could just pass nil and end all editing. > The latter may make more sense for the detail view, as I assume the decision > might apply to every field... > >> On Jan 2, 2013, at 9:10 PM, Keary Suska wrote: >> >>> On Jan 2, 2013, at 7:29 PM, Patrick Cusack wrote: >>> >>>> Ok, I do have a delegate for my controls and am currently using >>>> control:textShouldEndEditing:. If I return no, however, my control still >>>> has focus, and I can't think of a programmatic way to lose focus without >>>> committing changes. >>> >>> You would call -discardEditing on the NSObjectController that should be >>> managing the detail interface. >>> >>>> On Jan 2, 2013, at 5:20 PM, Keary Suska wrote: >>>> >>>>> On Jan 2, 2013, at 9:59 AM, Patrick Cusack wrote: >>>>> >>>>>> Sorry, I might not be clear. I have a table view that is bound to an >>>>>> NSArraryController. I want users to be able to edit single and multiple >>>>>> selections from a detail view that has NSTextfields and ComboBoxes. >>>>>> There are occasions where users forget that they have selected multiple >>>>>> items and proceed to edit cues, unaware that they are actually mutating >>>>>> more than one row of data. When an editor tabs into a control like the >>>>>> NSTextField or NSComboBox, I want to give them a chance to discard >>>>>> editing. I can easily deduce that multiple items in my NSArrayController >>>>>> are selected, throw an NSRunAlert, and give users an option to make a >>>>>> choice, but at that point, I have already entered focus into the control >>>>>> and any attempt to leave that control will still change the selected >>>>>> items. I tried overriding acceptsFirstResponder, and conducting my test >>>>>> in that selector, but acceptsFirstResponder gets called more than once, >>>>>> and then the control passes focus onto the next control in the kew view >>>>>> loop. Really what I want to a accomplish is to discard the editing and >>>>>> resign focus from the control. >>>>> >>>>> No--my error--you did say that you are editing in a detail interface. The >>>>> only thing I can think of is to register a controller as the delegate for >>>>> the detail fields, then you have access to control:textShouldEndEditing: >>>>> and friends (look for the NSControlTextEditingDelegate protocol in the >>>>> docs). All NSControl subclasses use these so it should work for your >>>>> combo boxes as well. >>>>> >>>>>> On Jan 2, 2013, at 6:41 AM, Keary Suska wrote: >>>>>> >>>>>>> On Jan 2, 2013, at 12:05 AM, livinginlosange...@mac.com wrote: >>>>>>> >>>>>>>> I have an application where a user can select multiple rows of data >>>>>>>> from an NSArrayController and edit those rows from a detail view. Now, >>>>>>>> there are cases where users have inadvertently changed the values for >>>>>>>> multiple rows of data when they did not intend to. How can I warn a >>>>>>>> user when they enter a texfield or nscombobox that they are about to >>>>>>>> edit multiple rows of data and gracefully give them a way to back out? >>>>>>>> I noticed that there is no way to discard editing when in a textfield. >>>>>>>> Is that the case? I am using the control: textShouldEndEditing: >>>>>>>> delegate method which allow me to get 90% of the way there, but the >>>>>>>> textfield retains focus, and I can not tab out of the field without >>>>>>>> getting my warning. Ideally, pressing "esc" should allow me to discard >>>>>>>> any editing and make the field lose focus. >>>>>>> >>>>>>> IIRC you can set a delegate to the table view and implement >>>>>>> tableView:shouldEditTableColumn:row:, and you should be able to prevent >>>>>>> editing from even starting until the user has confirmed. >>> >>> >>> Keary Suska >>> Esoteritech, Inc. >>> "Demystifying technology for your home or business" >>> >> > > > Keary Suska > Esoteritech, Inc. > "Demystifying technology for your home or business" > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com