As your second paragraph indicates, there is not a one-to-one correspondence between whatever knowledge you have now and programming for iPad.
This is one time where your existing knowledge is actively harmful to learning new things. That is a counterintuitive concept and you will be sorely tempted to keep trying to match up your existing concepts with Cocoa/OS X/iOS/Xcode concepts. The problem is that there are just enough matches between concepts to keep you doing this until you get frustrated and give up.
Spot on. When I was learning French, words which sounded like English words but meant something totally different were called 'False Friends'. Same thing when moving between programming languages and paradigms.
Sure, IBActions
feel a lot like .NET event handlers, but the context in which they sit is completely different.
.NET lets you tie code to the UI very tightly. Clever programmers have known that's a Bad Idea since about 1985. My .NET projects avoid (if at all possible) any direct linkage between the two. But I have to consciously make that architectural decision and code to that standard myself (and it can be quite laborious -- especially when it's soooo tempting just to slap a bit of logic in an event handler because it's so easy).
Cocoa won't have any of that. Cocoa says 'This is your UI. These are your Controller classes. Now, tell me
explicitly how the two communicate.'
Also, find a tutorial on Cocoa Bindings and KVO. Pay particular attention to where UI object properties are bound to other UI objects and their properties. Keeping the View/Controller division encourages you to hook up many of your UI changes
within the UI itself. So things like visibility of controls, populating values from sliders, etc. can all be done in IB without a line of code.
For example, think of a slider that has a range of 0 to 100. Now, maybe you want a label to show the current value of the slider. Just bind the text value of the label to the value of the slider (all in IB - no code!) and you're done. Now use an IBOutlet to make that value available in your code.
In Cocoa, think 'What data needs to move between my UI and my code, and what UI actions does my code need to know about?'
Ideally, your code shouldn't care about the UI. In a perfect world, you'd be able to remove the UI from an app and replace it with a script that could automatically push events and show data from your classes. Get that far and welcome to the world of automated testing
EDIT: Sure, .NET has DataBindings, but they're nowhere near as sleek as Cocoa Bindings. They're much more 'hand-cranked' than Cocoa Bindings which 'just work' for well-written code.