iPhone/Obj-C: Accessing a UIScrollView from a View displayed within it.
        Posted  
        
            by Daniel I-S
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Daniel I-S
        
        
        
        Published on 2010-04-13T16:41:03Z
        Indexed on 
            2010/04/13
            16:43 UTC
        
        
        Read the original article
        Hit count: 796
        
I'm writing a simple iPhone app which lets a user access a series of calculators. It consists of the following:
- UITableViewController(- RootViewController), with the list of calculators.
- UIViewController+- UIScrollView(- UniversalScroller), which represents an empty scroll view - and has a 'displayedViewController' property.
- UIViewController(- Calculators 1-9), each of which contains a view with controls that represents a particular calculator. Each calculator takes 3-5 values via- UITextFields and- UISliders, and has a 'calculate' button. They can potentially be taller than 460px(iPhone screen height).
The idea is:
- User taps on a particular menu item in the - RootViewController. This loads and inits- UniversalScroller, ALSO loads and inits the- UIViewcontrollerfor the particular calculator that was selected, sets the- displayedViewControllerproperty of- UniversalScrollerto the newly loaded calculator- UIViewcontroller, and pushes the- UniversalScrollerto the front.- When the UniversalScrollerhits its 'viewDidLoad' event, it sets itscontentSizeto the view frame size of its 'displayedViewController' object. It then adds thedisplayedViewController'sview as asubviewto itself, and sets its own title to equal that of thedisplayedViewController. It now displays the calculator, along with the correct title, in a scrollable form.
 
- When the 
Conceptually (and currently; this stuff has all been implemented already), this works great - I can design the calculators how I see fit, as tall as they end up being, and they will automatically be accommodated and displayed in an appropriately configured UIScrollView. However, there is one problem:
The main reason I wanted to display things in a UIScrollView was so that, when the on-screen-keyboard appeared, I could shift the view up to focus on the control that is currently being edited. To do this, I need access to the UniversalScroller object that is holding the current calculator's view. On the beganEditing: event of each control, I intended to use the [UniversalScroller.view scrollRectToVisible: animated:] method to move focus to the correct control. However, I am having trouble accessing the UniversalScroller. I tried assigning a reference to it as a property of each calculator UIViewController, but did't seem to have much luck. I've read about using Delegates but have had trouble working out exactly how they work.
I'm looking for one of three things:
- Some explanation of how I can access the methods of a UIScrollViewfrom aUIViewControllerwhose view is contained within it.
or
- Confirmation of my suspicions that making users scroll on a data entry form is bad, and I should just abandon scrollviews altogether and move the view up and down to the relevant position when the keyboard appears, then back when it disappears.
or
- Some pointers on how I could go about redesigning the calculators (which are basically simple data entry forms using labels, sliders and textfields) to be contained within UITableViewCells(presumably in aUITableView, which I understand is a scrollview deep down) - I read a post on SO saying that that's a more pleasing way to make a data entry form, but I couldn't find any examples of that online. Screenshots would be nice. Anything to make my app more usable and naturally 'iPhone-like', since shuffling labels and textboxes around makes me feel like I am building a winforms app!
I've only recently started with this platform and language, and despite being largely an Apple skeptic I definitely see the beauty in the way that it works. Help me solve this problem and I might fall in love completely.
Dan
© Stack Overflow or respective owner