Graham, Thanks for your fast response. I'll look at this ASAP, and will let you know how it goes :-)
Cheers, Gilles On Jun 12, 2012, at 2:27 AM, Graham Cox wrote: > > On 12/06/2012, at 12:29 AM, Gilles Celli wrote: > >> the sheet is properly displayed (with its TextField and button) for the >> current document window, but the textField stringValue can't be set >> Maybe because it's the sheet is on a different thread ?… >> >> I've tried to get the sheet's textField string setting on the main queue to >> allow the update, but this doesn't work either…. >> Does someone have any clues ? >> appendBlock = ^{ >> >> dispatch_async(dispatch_get_main_queue(), ^{ >> [[appendFilesSheet appendTextField] setStringValue:@"Appending >> Files..."]; >> //[[appendFilesSheet appendTextField] setNeedsDisplay: YES]; >> NSLog(@"[appendFilesSheet appendTextField] stringValue: %@", >> [[appendFilesSheet appendTextField] stringValue]); >> }); >> }; >> >> //Run the block on a different thread. >> dispatch_queue_t queue = >> dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); >> dispatch_async(queue,appendBlock); > > > Since the text field is UI, you can't drive it from a thread other than the > main thread. I think this includes calling its -setStringValue: method. > > So you need to invoke that on the main thread - use [textField > performSelectorOnMainThread:withObject:waitUntilDone:]; > > That will only work if you're not also blocking the main thread. I couldn't > quite unravel your code, but it looks like nothing will happen because the > main run loop isn't running while your loop is hogging the main thread. If > you can do your files work on another thread, that could work, otherwise > you'll have to break down the work your loop does and call it in pieces so > that the normal work of the main thread is able to run. An easy way to do > this is to use NSOperationQueue using the +mainQueue object which does the > work (NSOperations) in pieces on the main thread. If your operations are > thread-safe, this approach can be changed to a threaded approach by simply > making an operation queue object of your own. > > Another problem is that you start your work as soon as you've called > beginSheet... on your panel. That method returns very quickly, and before the > window itself is loaded, animated into position and run modally. That means > your work has started before the window is available, so it may be that your > references to its text fields are nil. It might be better to wait until the > window is actually loaded (windowDidLoad) before doing your work, and make > sure the work doesn't block the main thread. > > --Graham > > _______________________________________________ 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