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, [email protected] 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 ([email protected])
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 [email protected]