Mailing Lists: Apple Mailing Lists
Image of Mac OS face in stamp
Re: Modal Sheet without Spaghetti?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Modal Sheet without Spaghetti?



Thanks for your thoughts, Graham and Michael. My irritation is not so much with the "Do you really want to do this? How?" dialogs, but in presenting errors.

Probably I should have given a more concrete example, as I now have [1]. This simplified code from my real app performs a "sync in" to a document of some data from a source on a remote server. For many good reasons (for example, to facilitate other programmatic entries into this process and to allow subclasses to have different implementations), the -makeConnection method is the sixth function in a call stack that begins with the IBAction syncIn:.

Now, what if the network connection fails? I've been presenting the error in a modal dialog, but as I said in my original post, since this network connection failure only affects the current document, I believe that good UI design would want the error presented in a sheet on the document window instead. However, to do so, my code would become a bloody mess.

So I looked again at -[NSDocument presentError:] and saw that it "does not return until the user dismisses the alert". Whoopee!! But upon trying it, I see that gives a free-standing modal dialog box instead of the sheet that I want. Oh, well.

Apple's dialog-box implementation of -[NSDocument presentError:] leads me to believe that Apple has punted on this problem as well. I guess I'll just continue to use the modal dialog -- until I have a free day to consider this challenge.

Jerry

[1] Note: In real life, these methods are in several different classes, but I mashed them together for easier reading.

- (IBAction)syncIn:(id)sender {
    [self syncInWithDeference:BkmxDeferenceAsk
                  ifNotNeeded:YES] ;
}

- (void)syncInWithDeference:(BkmxDeference)deference
                ifNotNeeded:(BOOL)ifNotNeeded {
    // Some Code Here...
    // ....
    for (...]) {
        [internalizer internalizeWithDeference:deference
                                   ifNotNeeded:ifNotNeeded] ;
    }

    // Some Code Here...
    // ....
}

- (BOOL)internalizeWithDeference:(BkmxDeference)deference
                     ifNotNeeded:(BOOL)ifNotNeeded {
    BOOL ok = YES ;

    if (...) {
        // Some Code Here...
        // ....

        if (needDo) {
            ok = [self ixternalizeStartainer:extore
                                     error_p:&error] ;
            // Some Code Here...
            // ....

        }
    }

    return ok ;
}

- (BOOL)ixternalizeStartainer:(NSObject <Startainer> *)source
                      error_p:(NSError**)error_p {
    // Some Code Here...
    // ....

    BOOL ok = [extore readExternalDoingPrereqs] ;
}

- (BOOL)readExternalDoingPrereqs {
    [self setError:nil] ;
    // Some Code Here...
    // ....

    if (ok) {
        ok = [self makeConnection] ;
    }

    if (ok) {
        // Some Code Here...
        // ....

        ok = [self readExternalNoPrereqs] ;
        // Some Code Here...
        // ....
    }

    return (ok) ;
}

- (BOOL)makeConnection {
    // Some Code Here...
    // ....

    if (....) {
        ok = YES ;
    }
    else {
        while (!done) {
            alertReturn = [SSYAlert runModalDialogTitle:nil
                                                message:msg
                                                buttons:
                           button1,
                           [NSString localize:@"cancel"],
                           nil] ;
            if (alertReturn == NSAlertAlternateReturn) {
                // Some Code Here...
                // ....

                break ;
            }

            // Some Code Here...
            // ....
        }
    }

    return ok ;
}

_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:
This email sent to email@hidden


References: 
 >Modal Sheet without Spaghetti? (From: Jerry Krinock <email@hidden>)
 >Re: Modal Sheet without Spaghetti? (From: Graham Cox <email@hidden>)



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2011 Apple Inc. All rights reserved.