How to use Interface Builder with VoiceOver

Member of the AppleVis Editorial Team

This guide has been updated and moved. Please visit this complete guide to Xcode for VoiceOver users instead.



The guide on this page has generously been submitted by a member of the AppleVis community. As AppleVis is a community-powered website, we make no guarantee, either express or implied, of the accuracy or completeness of the information contained in this guide.


Hello, For me there is an


For me there is an easier way to place controls in the xib.

I find the desired control in the library, rout the mouse with cmd + vo + f5 do a double click with shift + vo + space and then copy with cmd + c.

Then I go to the xib in the source code group, select the view amd do a past with cmd _ v and the control is pasted right inside the view.

If I want to place more controls of a given type, pasting again will add another one.

So I copy the buttons and past as many of them as I beed, then go and pick other controls and this way I dont need to do the mouse drag stuff.


I'm having a problem making connections

I'm trying to add an action for a button to my view controller header. I select the button in the source group table I select the unknown item next to action in the inspector group route the mouse, turn off cursor tracking, and locked on the mouse. I then move the voiceover cursor to my header file. When I route the cursor here, I hear a message saying that a new window is displayed. When I unlock the most though this window disappears. I have tried this several times: well the new window is displayed before I unlock the mouse, there doesn't appear to me to be a way to interact with it

My apologies, I'm new to voiceover and using the cursor. Other any different settings I need in the VoiceOver utility? I ensure that cursor tracking is turned on when I'm done and turned it off before I start the drag.


Try This

Member of the AppleVis Editorial Team

First, route your mouse to the unknown to the right of "selector" and drag that. Second, don't drop it on the header file. Instead, interact with the "source code edit text" and use VO with the arrow keys to put your cursor where you want the line of code to appear. Route your mouse there, then release the mouse, and it should work. Don't forget to re-enable cursor tracking once the window appears, or funny things will happen. :) Good luck, and post back here if you still have trouble.

Making connections - part 2Hello,

Thank you for your reply! sorry, I should've been more clear with my original post, I was using my iPhone for the first post. Here is all the commands I'm using so we can see where what I'm doing differs from what you're doing:

I select the component in my story board table in the source code group. (I simply navigate to it without clicking as mentioned above.)
1. I navigate to the inspector group and select the connections radio button, I then go to the inspector scrolling pane.
2. I then find the "Action" item, second item in the list and VO+right arrow to select "Unknown"
3. I then hit VO+command+F5 to root the cursor on Unknown.
4. I then hit VO+Shift+F3 to turn cursor tracking off.
5. I then hit VO+Command+Shift+Spacebar to lock the cursor on mouse down.
6. I then navigate to the source code in my ViewController.h file and navigate to the space between the and code.
7. I then root my mouse here by hitting VO+command+F5. **Here is where what I'm seeing differs from everything else I've seen here. For me, this is where a new Window is displayed for me. I cannot interact with this window. (my macbook beeps when I try to interact with the window. I press vo+shift+f3 to turn on cursor tracking again and hit vo+f2+f2 to interact with the window pop-up to bring the "Unititled New Window" to front to try and interact with it.)
8. To be clear, I've tried rooting the cursor in my ViewController.h file, the new window is displayed and as before I cannot interact with it. i then hit VO+Command+Shift+F5 to complete the drag and do the mouse up. For me, the new window then disappears! :) With this method there must be a link up that I'm missing. It's like I'm so close to making it all happen with the window displaying and everything.

The only way I created an outlet once was to:
1. Select the control in the Main interface table in the source code group. I then move to column 2 where it is lab led "Button" and root my mouse there.
2. I then turn off voiceover. I have limited vision so I can see the cursor if I enlarge my screen enough - Option+Command++ or option+Command+- to adjust to magnifier.
3. I then do a control+click with my mouse and drag to where I think the right spot is in my ViewController.m file. (note this is my .m file and not the .h header file.)
4. I then release my mouse over the right spot. A new window is displayed, this is where I then turn voiceover back on and interact with the new window I can choose my action/ooutlet here and it gets inserted.
**Note: I've only gotten tho to work a couple of times, it's very slow and error prone so I prefer to find a solution that uses voiceover.

All the instructions I've seen for creating connections in interface builder mention that you need to control click and drag to create a connection. In the instructions mentioned here I only see instructions about clicking and dragging. I haven't found a way to control click drag in VoiceOver.

DWhat I'm wondering is if any of you who have gotten this to work have different cursor tracking setting enabled in your VoiceOver utility? My apologies again, I'm still pretty new to VoiceOver and Xcode but have previous programming experience and I'm stubborn enough to get this to work. :)


Selector, not Action

Member of the AppleVis Editorial Team

What I do is drag the unknown next to Selector, not next to Action. At first I was trying to use Action, but I got the same results you did. When I tried Selector, everything worked.

To make an outlet, do the same process as with Selector, but drag the unknown next to New Referencing Outlet. Drag it to the .h file, not the .m file. You are basically creating a class property here, so the @property statement must be in the .h file. Let us know how things work out. Oh, this process simulates a control drag. Don't ask me how, because I have no idea, but it works. Possibly because you hit the control key as part of routing the mouse? I really don't know, I'm just glad we can do it. :)

The strange part here is the

The strange part here is the following ...

2. I then find the "Action" item, second item in the list and VO+right arrow to select "Unknown"
Do not do it. Instead, in the same list, choose selector and vo right and use that unknown.

7. I then root my mouse here by hitting VO+command+F5. **Here is where what I'm seeing differs from everything else I've seen here. For me, this is where a new Window is displayed for me.
So this window appears for all of us. Its so irrelevant that everyone else forgets to mention but believe ne things are right.
What's needed now is release the drag with vo command shift space and another window will appear, this one being perfect manageable with voiceover.
Now turn on cursor tracking again and have fun.
Please do report it back if things are working of if not describing what you have tried.

It's Automatic

Member of the AppleVis Editorial Team

When you successfully make a connection by dragging to your .h file, the stub appears in the .m file automatically. If not, you can easily create one by copying the declaration from your .h file and pasting it, then replacing the semicolon with a left brace and writing your function's code.

Auto layout

After setting X and Y manually for my elements I read in a tutorial on another site that I should use the option to add missing constraints. However, this option is dimmed out. Any help in explaining this would be greatly appreciated.

Need an updated guide

App Developer

We might need an updated guide. I tried everything here. However, after getting a button in the window (in the interface builder outline), running the project, and looking at the window, the button just put in the outline does not exist on the form. Any tips?

accessibility @ apple say:


I emailed Apple Accessibility about this particular problem, namely layint out interfaces in xCode and fixing connections etc.
I showed them the steps described here, and received the following reply:
 After some more testing one of our engineering groups wanted to point out the following:
---start email----
It sounds like you are trying to use control-drag into source to create their connections but you are not required to do it that way. You could instead insert the code first, then use the connections inspector to connect from the view controller icon in the outline view (for example) to the UI control in the scene they wanted. This wouldn’t require control dragging into source.
This may not seem quite as intuitive, but it is actually a very fast way to work.  Many (most?) experience Xcode users do it this way because it is more efficient.  The control-drag route is what we demo in docs since it makes it more obvious to a new user what exactly is happening, and how code is “connected” to UI, but it isn’t necessarily the preferred workflow.
---end email---
Could someone tell me if this is indeed easier for VoiceOver users? I myself don't know enough about xCode and app development to test.

Accordingly to Alex in

Accordingly to Alex in another post things will change hopefully towards a better situation for us in XCode 7.
I have not played with XCode 7 and if I did I couldn't tell anything because of the NDA but I remember Alex himself wrote that new podcasts are being produced and I personally hope to see them as soon as the release is oficial.
I would wait. So many things changed (this is public information so no worries here) such as swift having a new version, XCode interface changes, the fact that everyone will be able to run iPhone softwares produced by themselves on tgheir own devices without having to pay the dev account and so on .... I would wait if possible for the next version to come and then we will see what efectively has changed.
The fact that I can lçlearn slowly and test my own stuf on my own device without paying is amasing enough, this way I can spend more than one year and I won't have the pressure to produce something soon. The fact that I can produce my own software for personal use and if I want or feel confortable I can release to the public is also great.

Can't make connections

I got stuck in making connections. Whenever I'm trying to open my view controller in the assistant editor and then moving to my xib file, I get a file called NSObject.h in my assistant editor. Any ideas what might be up with that? I'm making an iOs app in swift with the "Single view application" template on Xcode 6.4.

Sorted out

Apparently the assistant editor wasn't picking up the right file even though it was supposed to. Behind the menu button in the navigation bar I could select my view controller.


To my knowledge, you could always run XCode and develop apps for your own personal use, without paying.
It's when you want to release to the app store you have to pay. Though, since if I do develop apps for the App Store I'd want them to be free. Unfortunately, I still have to pay for a dev account for that. It would be nice if those of us who want to release apps to be proud to have stuff out there and release our stuff for free we shouldn't have to shell out $100 yearly IMO.

One needs to pay if they want

One needs to pay if they want to test their software on their own device.

Without an account you can use only the simulator and this is not good enough specially for voiceover users now.
It will change with XCode 7 .... you'll be albe to use your device to test without paying for an account and this is very good.