I’ve been trying to wrap my head around how to convert my existing “display alert”'s to a sheet style NSAlert attached to the main window. I’ve found some helpful hints on this forum, but I’m stuck.
I have two issues:
Clicking the Default Button in the alert panel returns a EXC_BAD_ACCESS
None of the buttons seem to send a returnCode as an integer. I’d like to be able to do something different depending on which button was pressed. This all seems pretty straight forward, but I’m at a loss.
Here’s the code I’ve been playing with:
property parent : class "NSObject"
property mainWindow : missing value
property alertWindow : class "NSAlert"
set theAlert to alertWindow's alertWithMessageText_defaultButton_alternateButton_otherButton_informativeTextWithFormat_("An alert", "OK", "Cancel", missing value, "Further explanation")
theAlert's beginSheetModalForWindow_modalDelegate_didEndSelector_contextInfo_(mainWindow, me, "alertDidEnd:returnCode:contextInfo:", missing value)
on alertDidEnd_returnCode_contextInfo_(theAlert, returnCode, contextInfo)
Any help would be GREATLY appreciated. Please let me know if there’s anymore info I can provide.
Do you have Shane Stanley’s book on ASOC? He also includes code that can run an alert sheet, and I know it works, I’ve used it. You just plug in 2 Cocoa class files and then use the ASOC code.
It’s a great e-book (PDF) and very helpful code. It’s about $35 I think.
Thanks for replying to my post! I’ve been eyeing Shane Stanley’s book on macosxautomation.com. You’ve sold me, I’m buying
I’m sure I’ll learn a ton from the book, but I’d still like to know what I’m doing wrong with the code I posted. I like to learn from my mistakes Am I not initializing it correctly? Any insight would be great!
It’s not so much what you’re doing as a bug. The problem is with the contextInfo: argument, which is a void * type, and AppleScriptObjC doesn’t cope with such things. I believe the problem was fixed in Lion, but I haven’t tried it yet myself.
You should probably also makes the alert differently. From the documentation on alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:
This is a compatibility method.[ …] Unless you must maintain compatibility with existing alert-processing code that uses the function-based API, you should allocate (alloc) and initialize (init) the object, and then set its attributes using the appropriate methods of the NSAlert class.
I have tried it in Lion, and it still doesn’t work properly. I can get the beginSheetModalForWindow_modalDelegate_didEndSelector_contextInfo_ method to work but only if I use a selector that has only one argument, the alert itself, so no way to get the return code.
I did get it to sort of work if you create the alert with an alloc init (and do nothing else), and then I can pass a number or an NSString as the context info, but the return code is null. If I add buttons with addButtonWithTile, then I get the dreaded “EXC_BAD_ACCESS” error message.