With a huge influx of newbies to Xcode I'm sure there are lots of Xcode tips and tricks to be shared.
What are yours?
With a huge influx of newbies to Xcode I'm sure there are lots of Xcode tips and tricks to be shared.
What are yours?
⌘ Command + Double-Click on a symbol
: Jump to Definition of a symbol.
⌥ Option + Double-Click on a symbol
: Find Text in Documentation of a symbol. (Only works if you have they symbol's Doc Set installed.)
Favorites bar is just like you have in Safari for storing - well - favorites. I often use it as a place to store shortcuts to files I am using right now. Generally this is more useful when I'm working with a large or unfamiliar project.
To show the Favorites Bar, select the following menu option:
View
> Layout
> Show Favorites Bar
Command ⌘ Shift ⇧ D
File > Open Quickly...
I'm a big fan of the Open Quickly feature, which is particularly good in Xcode 3.1 and later. When you want to open a file or a symbol definition that's in your project or in a framework, just hit the keyboard shortcut, type a bit of the file or symbol's name, use Up Arrow ↑ and Down Arrow ↓ to pick to the right result (if need be), and then hit Return ↩ to open the file or navigate to the symbol definition.
Also, something I didn't know about Xcode until two minutes ago (when schwa pointed it out in a comment) is that, if the editor's text caret is inside of a word when Open Quickly is invoked, that word will be used as the Open Quickly search term.
(In the Groups and Files pane, open the Targets disclosure triangle to display the targets associated with your project.)
(This wasn't available two years ago, but it's nevertheless worth pointing out as a significant time-saver over finding the framework in the filesystem and dragging it into the project...)
Option ⌥ Command ⌘ Up Arrow ↑
View > Switch to Header/Source File
Switches between the .m
and .h
files.
Tab ⇥ OR Control ⌃ /: Select the next auto-completion argument.
Shift ⇧ Tab ⇥ OR Shift ⇧ Control ⌃ /: Select the previous auto-completion argument.
Escape ⎋: Shows the auto completion pop-up list.
Command ⌘ Shift ⇧ E
View > Zoom Editor In
Drag the splitter (between the editor window and the file list above it) upwards.
If your window displays both the detail and editor view, you can zoom the editor in to expand the editor view to the full height of the window. (This is fairly easily found, but many seem to overlook it.)
When you use code completion on a method and it has multiple arguments, using CTRL + / to move to the next argument you need to fill in.
You can have Xcode run the preprocessor over your Info.plist file:
<key>CFBundleShortVersionString</key> #ifdef DEBUG <string>1.0 (debug)</string> #else <string>1.0</string> #endif
See http://developer.apple.com/technotes/tn2007/tn2175.html for details.
Cmd-/ to automatically insert "//" for comments. Technically the same number of keystrokes, but it feels faster...
Also the default project structure is to put resources and class files in separate places. For larger amounts of code create logical groups and place related code and xib files together. Groups created in XCode are just logical structures and do not change where your files are on disk (though you can set them up to replicate a real directory structure if you wish)
Xcode supports text macros that can be invoked via the Insert Text Macro menu at the end of the Edit menu. They can also be invoked using Code Sense, Xcode's code completion technology.
For example, Typing the key sequence p i m control-period
will insert #import "file"
into your code, with file
as an editable token just like with code completion.
When using Code Sense with many keybaords, use control-comma to show the list of available completions, control-period to insert the most likely completion, and control-slash & shift-control-slash to move between placeholder tokens. The keys are all together on the keyboard right under the home row, which is good for muscle memory.
"Ctrl+Left/Right Arrow" to do intra-word text navigation. I use this feature to jump the cursor from the one "camel hump" in a variable to the next.
Might go without saying, but if you want to use intra-word navigation, make sure you change the key presets in for Spaces (in the Expose & Spaces preference pane), if you use it.
I switched Spaces to use Ctrl-Option Left/Right.
Edit: To set Spaces to Ctrl-Option Left/Right, select the "To switch between spaces:" popup and hold down the Option key. The first item will change from Ctrl Arrow Keys to Ctrl-Option Arrow Keys.
Get Colin Wheeler's Complete Xcode Keyboard Shortcut List (available as PDF or PNG). Print it and keep it somewhere visible (I've got it on the wall next to my screen).
The class browser in Xcode! Reached by pressing shift-cmd-c. You can reduce the scope to only show your active project. It gives you a less cluttered view as long as you only want to browse the class hierarchy.
Right click on any word and select 'Find Selected Text in API Reference' to search the API for that word. This is very helpful if you need to look up the available properties and/or methods for a class. Instead of heading to Apple.com or Google you will get a popup window of what you were looking for (or what was found).
Right click on a variable in your function and click edit all in scope. Been using it a lot since I found this out.
Move back or forward a full word with alt-. Move back or forward a file in your history with cmd-alt-. Switch between interface and implementation with cmd-alt-.
Jump to the next error in the list of build errors with cmd-=. Display the multiple Find panel with cmd-shift-f. Toggle full editor visibility with cmd-shift-e.
Jump to the Project tab with cmd-0, to the build tab with cmd-shift-b and to the debug tab with cmd-shift-y (same as the key commands for the action, with shift added).
Not much of a keyboard shortcut but the TODO comments in the source show up in the method/function dropdown at the top of the editor.
So for example:
// TODO: Some task that needs to be done.
shows up in the drop down list of methods and functions so you can jump to it directly.
Most Java IDEs show a marker for these task tags in the scrollbar, which is nicer, but this also works.
You can use:
#pragma mark Foo
... as a way to organize methods in your source files. When browsing symbols via the pop up menu, whatever you place in Foo
will appear bold in the list.
To display a separator (i.e. horizontal line), use:
#pragma mark -
It's very useful, especially for grouping together delegate methods or other groups of methods.
Apple's API reference documentation does not show methods inherited from a superclass. Sometimes, though. it's useful to be able to see the full range of functionality available for a class -- including a custom class of your own. You can use the Class Browser (from the Project menu) to display a flat or hierarchical list of all the classes related to a current project. The upper pane on the right hand side of the browser window shows a list of methods associated with the object selected in the browser. You can use the Configure Options sheet to select "Show Inherited Members" to show inherited methods as well as those defined by the selected class itself. You click the small book symbol to go to the corresponding documentation.
⌘-[ and ⌘-] to indent and unindent selected text. Makes cleaning up source code much easier.
Control ⌃ 2: Access the popup list of methods and symbols in the current file.
This is super useful because with this shortcut you can navigate through a file entirely using the keyboard. When you get to the list, start typing characters and the list will type-select to the symbol you are looking for.
The User Scripts menu has a lot of goodies in it, and it's relatively easy to add your own. For example, I added a shortcut and bound it to cmd-opt-- to insert a comment divider and a #pragma mark
in my code to quickly break up a file.
#!/bin/sh
echo -n "//================....================
#pragma mark "
When I hit cmd-opt--, these lines are inserted into my code and the cursor is pre-positioned to edit the pragma mark component, which shows up in the symbol popup.
Debugging - how to using gdb
Being a newbie still, I find trapping and identifying faults a rather daunting job. The console, despite it being a powerful tool, usually does not yield very intuitive results and knowing what you are looking at in the debugger can be equally difficult to understand. With the help of some of they guys on StackOverFlow and the good article about debugging that can be found at
Cocoa With Love it becomes a little more friendly.
http://cocoawithlove.com/2008/10/debugging-tips-for-objective-c.html
Being able to split the current editor window horizontally, which is great for wide screen monitors to be able to view the source and header file side by side. There are two different methods for doing depending on what version of Xcode you are using.
In XCode 3.0 it is under Preferences, Key Bindings, Text Key Bindings at the bottom of that list.
In XCode 2.5 it is under Preferences, Key Bindings, Menu Key Bindings, View menu.
Double-click on the square brackets or parentheses to obtain bracket and parentheses matching.
In PyObjC, you can do the equivalent of #pragma mark
for the symbols dropdown:
#MARK: Foo
and
#MARK: -
Print Complete Xcode Keyboard Shortcut List and put it next to your monitor.
Hold Option while splitting windows to split vertically rather than horizontally.
Select a block of text and type cmd-/ to comment it out. Do it again to remove the comments characters.
This is especially useful when combined with brace-matching by double-clicking on balanced chars (parens, braces, brackets).
pragma mark
Example:
#pragma mark === Initialization ===
Writing this line above all initialization methods will generate a nice heading in the dropdown menu above the editor.
Open Quickly
Shift + cmd + D Start typing a file name you'd like to open. Very cool if you look for framework headers. They have nice comments too, sometimes additional info to the docs.
ESC
When your text-cursor is on a uncomplete method name for example, press ESC. It will shop up everything that might fit in there, and you can quickly complete very large method names. It's also good if you can't remember exactly the name of a method. Just press ESC.
I think these are the best ones I know until now.
(migrated from deleted question by http://stackoverflow.com/users/62553/swanzus-longus-xi)
Check out a nice screencast about 'becoming productive in Xcode': becoming-productive-in-xcode
Technically an Interface Builder tip, but they're a book-matched pair, so I don't think this is off topic...
Shift + Right Click on one of your controls and you get a nice pick list of the object hierarchy. No more click, click, click, frustration!
You should always have a breakpoint on objc_exception_throw
.
Use the following code:
NSZombieEnabled = YES;
NSDeallocateZombies = NO;
... to debug retain and release problems.
Command ⌘ + Double-click
on an object in Interface Builder's Document Window to jump to that class in Xcode. This is very handy with File's Owner.
Drag a customized object back to Interface Builder's Library for later reuse.
Control ⌃ Shift ⇧ + Click
on an object in Interface Builder to see a menu of all of the objects under the mouse.
When you attempt to undo after saving, you will get the following prompt:
"You are about to undo past the last point this file was saved. Do you want to do this?"
To get rid of this warning, enter the following into a terminal window:
defaults write com.apple.Xcode XCShowUndoPastSaveWarning NO
Paste this into the Terminal application:
defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{"ORGANIZATIONNAME" = "Microsoft";}'
com.yourcompanyname
" in all your templates:/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application
com.yourcompany
to whatever value you normally use to build for a device. I used BBEdit's multi-find-and-replace after I opened the whole directory. You should be replacing the value in all the info.plist
files. I found 8 files to change.
The number of times a build has failed because I forgot to change this string is ridiculous.
- Control ⌃ Option ⌥ Shift ⇧ + <First letter of a Group name>
If you hold down the three keys above, you can quickly jump to groups in the left (Groups and Files) page by pressing the first letter of a groups name. For example, Control ⌃Option ⌥Shift ⇧T takes you to Targets and Control ⌃Option ⌥Shift ⇧S to Source. Press it again and it jumps to SCM. Sometimes it takes several tries for this to work (I don't know why).
Control ⌃ .
Shift ⇧ Control ⌃ .: Cycles backwards between autocompletion choices.
Control ⌃. (Control-Period) after a word automatically accepts the first choice from the autocompletion menu. Try typing log
then Control ⌃. and you'll get a nice NSLog
statement. Press it again to cycle through any choices. To see all the mutable choices, type NSMu
then Control ⌃..
Control ⌃ Command ⌘ ? (While your cursor is in the symbol to look up)
Option ⌥ + <Double-click a symbol>
Help > Quick Help
To get to the documentation from the Quick Help window, click the book icon on the top right.
- Command ⌘ Option ⌥ + <Double-click a symbol>
Takes you straight to the full documentation.
- Command ⌘ Control ⌃ + <Double-click in the editor>
Use the above shortcut for a strange way of selecting multiple words. You can make selections of words in totally different places, then delete or copy them all at once. Not sure if this is useful. It's Xcode only as far as I can tell.
This trick works in all Cocoa application on the Mac (TextEdit, Mail etc.) and is possibly one of the most useful things to know.
- Command ⌘ Left Arrow or Command ⌘ Right Arrow Takes you to the beginning and end of a line.
- Control ^ a and Control ^ e Do the same thing
- Control ^ n and Control ^ p Move the cursor up or down one line.
- Control ^ f and Control ^ b Move the cursor back or forward one space
Pressing Shift ⇧ with any of these selects the text between move points. Put the cursor in the middle of a line and press Shift ⇧ Control ^ e and you can select to the end of the line.
Pressing Option ⌥ will let you navigate words with the keyboard. Option ⌥ Control ^ f skips to the end of the current word. Option ⌥ Control ^ b skips to the beginning of the current word. You can also use Option ⌥ with the left and right arrow keys to move one-word-at-a-time.
Try it with NSMutableArray
. You can quickly change it to NSArray
by putting your cursor after the NS
, pressing Shift ⇧ Control ^ Right Arrow then Delete.
OK, this is late but I love it:
control Xcode's text editor from the command line: xed
> xed -x # open a new untitled document
> xed -xc foo.txt # create foo.txt and open it
> xed -l 2000 foo.txt # open foo.txt and go to line 2000
# set Xcode to be your EDITOR for command line tools
# e.g. for subversion commit
> echo 'export EDITOR="xed -wcx"' >> ~/.profile
> man xed # there's a man page, too
If you have a mutli touch capable mac - use MultiClutch (http://wcrawford.org/2008/02/28/everytime-i-think-about-you-i-touch-my-cell/) to map some of the keystrokes described by mouse gestures.
I use 3 finger forward and back to go frward and back in file history (cmd-alt-.), and pinch to switch between .h and .m
Use AppKiDo to browse the documentation.
Use Accessorizer for a bunch of mundane, repetitive tasks in Xcode.
This works in all Cocoa apps, but I like it especially when coding: ^T (Control-T) to transpose the two letters adjacent to the caret. For example:
fi
^T
.. becomes:
if
... which I find is a kind of typing error I make often.
If the hilighting gets messed up, if your ivars aren't hilighted or anything else, just do ⌘-A ⌘-X ⌘-V, which will select all, cut, and paste and all the hilighting will be corrected. So just hold down ⌘ and press A then X then V.
cdespinosa's answer to this question gives a method for a debugging-via-logging technique that requires no recompilation of source. An amazing trick that keeps code free of debugging cruft, has a quick turnaround, and would have saved me countless headaches had I known about it earlier.
prefixing a comment with TODO: will cause it to show up in the function "shortcut" dropdown menu, a la:
int* p(0); // TODO: initialize me!
I find that using the shortcuts for building/cleaning and running your project really saved me some time:
The entire shortcut list can be found here: http://iphonehuston.blogspot.com/2009/08/shortcuts-for-xcode.html
Ctrl-left/Ctrl-right to navigate words within a variable or method name. Can't live without this one.
Build success/failure noise; from term:
defaults write com.apple.Xcode PBXBuildSuccessSound ~/Library/Sounds/metal\ stamp.wav
defaults write com.apple.Xcode PBXBuildFailureSound ~/Library/Sounds/Elephant
the fact that I can use emacs as my editor and xCode as my builder/debugger... Best of both worlds, IMHO.
I also adore the "re-indent". True there is no default shortcut, but you can add one from the Text Key Bindings tab of the Key Bindings preference pane.
Which is a time-saver all its own. Just lookup your favourite actions and add/edit keyboard shortcuts!
One set of defaults I do find handy are the CMD+" and CMD+' to add/remove vertical splits. Hold down option for these and now you have the same for horizontal. But if these gestures don't work for you, you can always change them.
I have no idea if everybody knows this already, but I was delighted when I learned I could use "code folding" and hide nested functions that I didn't want to look at by clicking on the gray area nearest to the code that you want to fold.
Hard to explain . . .
⇧⌘A. It will build and analyze, meaning that Xcode will warn you about possible leaks.
Alt-Left & Right to go to the end/start of the line. This along with the CTRL-Left & Right to move to the next capital letter, or word break. these two save me so much time
I don't really like the code-formatting/reindent feature that is built into xcode, so I found using uncrustify as a code formatter very useful. It can be used as a User Script: http://hackertoys.com/2008/09/18/adding-a-code-beautifier-script-to-xcode/
[
in the correct locationI come from a .net background so I'm used to typing a symbol and then typing one of its method names. So I always forget to include the [
before I start typing the object name. Usually this meant I would need to go to the beginning of the line and add the [
manually. I didn't realize I could just press ] at the current cursor position and it will be added automatically.
1) This works both at the end of a function, e.g.:
myObject testMethod
]
... becomes:
[myObject testMethod]
2) As well as before the function name, e.g.:
myObject
]
... becomes:
[myObject ]
The advantage of the latter (2) is that code completion will filter on the methods of your object. Whereas with the former (1) if you try to invoke code completion immediately after myObject
, it won't be filtered. Another advantage to (2) is it behaves more like other programming languages that use dot notation. You type the name of the object then simply ] instead of . to access a method.
Use xcodebuild command line to do a clean build on the shared build machine:
cd project_directory xcodebuild -configuration Release -alltargets clean xcodebuild -configuration Release -alltargets
Sort contents of Groups in Xcode's Groups & Files pane by selecting the Group, then Edit > Sort By > Name.
You expect to find this in the contextual menu for the group, but it isn't there.
When typing a method press ESC to see the code completion options (no doubt this has been mentioned before). I already knew about this, but TODAY I discovered that if you press the button in the lower-right-hand corner of the code completion window (it'll be either an 'A' or Pi) you can toggle between alphabetical sorting and what appears to be sorting by class hierarchy.
All of a sudden this window is useful!
A different way to set the your company name in a project template is to:
This should now add your company name to all your project templates as well as providing other applications with more autofill information!
I have created my own file templates for NSObject, UIView and UIViewController so when I create new classes, the files are all set up with private sections and logging of class' address in init and dealloc.
Example (NSObject derived class named 'test' will start like this):
//=====================================================
// Private Interface
//=====================================================
@interface test (private)
@end
//=====================================================
// Public Implementation
//=====================================================
@implementation test
- (void)dealloc {
NSLog(@">>> Dealloc: test [0x%X]", self);
[super dealloc];
NSLog(@"<<< Dealloc: test");
}
- (id) init
{
self = [super init];
if(self) {
NSLog(@">>> Alloc: test [0x%X]", self);
}
return self;
}
@end
//=====================================================
// Private Implementation
//=====================================================
@implementation test (private)
@end
Plenty of resources available for this, e.g.: http://arstechnica.com/apple/guides/2009/04/cocoa-dev-design-your-own-xcode-project-templates.ars
There are many adjustments you can make to how Xcode treats the formatting of your code, but only if you change the settings via command line. I threw together a little program that lets you adjust them to your liking. Enjoy :)
As for "Open Quickly" feature - it's great, but I've always missed TextMate's cmd-shift-t for browsing the projects and files (symbols, methods, etc).
That's why I've released an Xcode plugin that provides just that. It's called Code Pilot and you might want to take a look at it: http://macoscope.net/en/mac/codepilot/
In shell build phases you can write to stderr using the following format:
<filename>:<linenumber>: error | warn | note : <message>\n
It's the same format gcc uses to show errors. The filename:linenumber part can be omitted. Depending on the mode (error, warn, note), Xcode will show your message with a red or yellow badge.
If you include an absolute file path and a line number (if the error occurred in a file), double clicking the error in the build log lets Xcode open the file and jumps to the line, even if it is not part of the project. Very handy.
Control+R to execute selected text as a shell script which returns with the pasted output following the selection!
cmd + ctrl + up / down collapses all of your functions or uncollapses them.
To display the current Autocompletion options in a popup menu by default (without having to press ESC first), type
defaults write com.apple.Xcode XCCodeSenseAutoSuggestionStyle List
in Terminal and restart Xcode.
Select a block of text and use
Command + '/'
To comment out the block of text. Selected the commented block and use the same shortcut to uncomment it.
Being able to quickly see all the methods that can be overriden from a super class. For example when extending UITableViewController I just type in my implementation:
- ta
and then I hit ESC to see all the methods from my superclass that begin with "ta" such as
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
This also works when adopting protocols.
XCode Code formatting... is one of the thing you need when you want to make your code readable and looks good.
You can do the code formatting by your self or save some time using scripts.
One good way is.. use Uncrustify explained here
Command ⌘ alt ⌥ shift T : reveal the current edited file in the project tree.
For me it’s always been: Command ⌘ + 0:
After you debug or run or anything, if you quit the iPhone Simulator or the debugging app, you’re left with the debugger window.
When you’re using “Single-Window Layout”, going back to the editor must be done with a click in the toolbar which is annoying (plus you later need to “remove the detail pane”).
The above shortcut does it and leaves you ready to code.
My favorites have to be these general editor shortcuts: