natural vista
Friday, August 29th, 2008
Posted from: http://maps.google.com/maps?ll=37.3355,-122.0307
|
Corbin Dunn and Louise Lovelle
|
Apple Category ArchivesCategories
Lastest Posts
Archives
Cool Links
Blog |
Archive for the 'Apple' Categorynatural vistaFriday, August 29th, 2008
Greener AAPLsWednesday, August 27th, 2008Xcode code completion and your codeThursday, August 14th, 2008How can you become a faster Cocoa programmer? One way is to adequately name your variables, enums and classes. Let’s start with enums and take an example from something new to NSTableView in Leopard. This is copied from NSTableView.h with the comments stripped out for clarity. enum { NSTableViewSelectionHighlightStyleRegular = 0, NSTableViewSelectionHighlightStyleSourceList = 1, }; typedef NSInteger NSTableViewSelectionHighlightStyle; - (NSTableViewSelectionHighlightStyle)selectionHighlightStyle; - (void)setSelectionHighlightStyle:(NSTableViewSelectionHighlightStyle)selectionHighlightStyle;
There are several things to notice here, some of which are important to you. The most important thing (in my opinion) is the common prefix. Notice that the enum values fully contain the enum type name. Why? The answer is code completion, which you should be using. It is much easier to remember one key portion of the name than to remember all values. In this case, the key thing to remember is “selection”. [tableView set And hit escape (or whatever key combo invokes code completion for you. For me, I remapped the key to ctrl-space, since I was used to Delphi and Visual Studio. But, I also use escape). and start typing “sel” to see the result you want:
The bottom line: use a common prefix, wherever you have a list of options. Also note that the NSTableViewSelectionHighlightStyle has the prefix NSTableView, since it only applies to NSTableView. But, the property name is “selectionHighlightStyle”, since it doesn’t make sense to replicate the type name there. WWDC 2008Monday, June 9th, 2008WWDC 2008! Howdy to my fellow Cocoa Developers. Take a look at the conference schedule: http://developer.apple.com/wwdc/schedules/ and be sure to come to my talk! Tuesday at 10:30 AM, iPhone for Mac Developers. If you have *any* Cocoa questions, come to the Cocoa labs! I’ll be working the labs this week, so find me (or any of the other great apple engineers) and ask questions! Edit: if you go to: http://developer.apple.com/wwdc/students/ you can see a picture of me from last year — I have the Leopard print hair:
Maker Faire 2008Wednesday, May 7th, 2008I was lucky enough to not only attend this years Maker Faire, but I also got to participate as a volunteer! I was a model in the Fashion Show put on by the Swap-O-Rama. Our friend Ashley is a marvel at all things fabric. She constructed some amazing articles of clothing for us to wear. Here’s the set of pictures: And a preview: Cocoa: willDisplayCell delegate method of NSTableView, [NSCell setTextColor], and “source lists”Wednesday, January 9th, 2008Mac OS 10.5 added a “source list” highlighting style to NSTableView, with the API below for your reference: enum { NSTableViewSelectionHighlightStyleRegular = 0, NSTableViewSelectionHighlightStyleSourceList = 1, }; typedef NSInteger NSTableViewSelectionHighlightStyle; - (NSTableViewSelectionHighlightStyle)selectionHighlightStyle; - (void)setSelectionHighlightStyle:(NSTableViewSelectionHighlightStyle)selectionHighlightStyle; Source lists should have bold text when the item is selected, and NSTableView attempts to auto-format the cell’s contents to automatically do this for you, as seen in this screen shot for the selected item in the open panel source list:
However, the code that does this formatting does so by converting the ’stringValue’ of the cell to an attributedStringValue that has the bold text. This is done *before* calling the delegate with “willDisplayCell”. The delegate gets the final say of how it looks in “willDisplayCell”, but this can cause unexpected results if you want to do something like this: - (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { if(row == 0) { [cell setTextColor: [NSColor redColor]]; } else { [cell setTextColor: [NSColor blackColor]]; } } The problem with the above code is that it is *too late* for the coloring to be correctly applied to the cell if it is selected. The work around is easy; you need to color the cell text earlier, and a perfect place to do that is in the new 10.5 delegate method “dataCellForTableColumn:” - (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { NSTextFieldCell *cell = [tableColumn dataCell]; if(row == 0) { [cell setTextColor: [NSColor redColor]]; } else { [cell setTextColor: [NSColor blackColor]]; } return cell; } Cool. Have fun. Overriding shortcut keys in the NSOpenPanel or NSSavePanelTuesday, December 11th, 2007It recently came up where someone needed to override some of the default shortcut keys in the NSOpenPanel or NSSavePanel. This is quite trivial to do. First off, the “easy way” would be to add a hidden NSPopUpButton in an accessory view that has the appropriate shortcuts. However, that won’t override the defaults (ie: cmd-r == reveal in finder, cmd-i == finder info window, cmd-a == select all, etc). To override these, you would subclass the appropriate panel: @interface MyOpenPanel : NSOpenPanel @end @implementation MyOpenPanel - (BOOL)performKeyEquivalent:(NSEvent *)theEvent { NSLog(@”…test”); // an example of where you would do your key testing return [super performKeyEquivalent:theEvent]; } @end You would then use it via something like:
[MyOpenPanel openPanel] Easy to do… Leopard: PhotoSearch demo app now liveMonday, November 5th, 2007PhotoSearch, a demo app I wrote for WWDC a few years ago, is now live: http://developer.apple.com/samplecode/PhotoSearch/ It demonstrates some cool custom cell stuff that is only available on Leopard. Instruments on Leopard: How to debug those random crashes in your Cocoa appWednesday, October 31st, 2007Mac OS 10.5 Leopard has a great new developer app called Instruments. It can easily be used to debug those “random crashers” in your application caused by too many -release or -autorelease calls. Let’s see how. If you want to follow along, download this project: CrashTestDummy.zip Open it up in Xcode. The nib has two outlets in it: a basic NSObject called testObject and button setup to invoke the following code: - (IBAction)buttonCrashTestAction:(id)sender { // We are going to autorelease the testObject too many times.. [testObject autorelease]; } So, we will hit the button a few times and we should get a crash. Compile the app with the Debug target. Start Instruments, and select the Object Allocations template:
Hit the purple “i” next to the instruments to bring up the inspector for it, and be sure to check “Record reference counts”, as seen below:
Cool. Click “Launch Executable” and select “Choose Executable”, and find CrashTestDummy.app from the built directory.
While you have the Open Panel up, add the environment variable NSZombieEnabled and set it to YES (sort of an optional step):
Hit Open, if you haven’t already done so. Hit “Record” in instruments, which will start the app, and click the “Crash Test” button a few times until the app crashes. Alright! Fire up Console.app and look for a line like this:
The important part is the address, 0×150d40, in this case. In Instruments, move the mouse to the right of “All Allocations” and a little triangle appears:
Click on it to see all the allocations. In the lower right hand corner of instruments click on the magnifying glass in the NSSearchField and select “Address”:
Type in your address, and you should see all allocations at that address:
Now, why so many? Well, addresses are reused. Chances are, the last allocation is your object, and sure enough, it is, since we know we are over releasing an NSObject instance. Click on that item, and you’ll see the history for it. Scroll to the bottom to see just the history for that NSObject:
Now! You should be able to figure out which release probably shouldn’t be there. We know it is #19 from our demo, but sometimes it isn’t that easy to figure out. Select #19’s row and then click the little gray arrow to next to its address (or whatever yours is), and then click on this button at the bottom of instruments to show the stack trace / extended detail:
You can then see when that “bad release” happened. Click on the thumb below for a full size screen shot of it. Ahh! Way cool. Of course, this was a simple and easy test case. Happy debugging :) corbin New Leopard user features - Open and Save PanelsTuesday, October 30th, 2007Leopard, the new Mac OS 10.5, is out! There are a lot of new features, but not everything is mentioned on the features page. Here are some of the cool “power user” features which you may not know about: The Open and Save Panel (implemented in Cocoa, also known as the NSSavePanel and NSOpenPanel) 1. There is a new Icon View mode with options: However, the way to change the icon size to be small (as seen above) isn’t obvious. Click and hold down on the icon view segmented cell and a popup will occur:
2. You can now insert items in the panel (and Finder) “side bar” by drag and dropping directly from the views (you couldn’t do this on Tiger!) You can also rearrange or remove items. 3. When you have an item selected, cmd-r will “reveal” it in Finder 4. When you have an item selected, cmd-i will give the Finder “info” window. 5. If you perform a search, you can save the search (just like in Finder). In addition, you can save it just for that application: …and it appears in a special sidebar section for just that app (to remove it, drag it out):
That’s it for now. 5 new features not even included in the top 300! |
(c) 2008 Corbin Dunn
Corbin’s Treehouse is powered by WordPress. Made on a Mac
Entries (RSS) and Comments (RSS).
26 queries. 0.562 seconds.
Bad Behavior has blocked 445 access attempts in the last 7 days.