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: 744
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 viaUITextField
s andUISliders
, 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 initsUniversalScroller
, ALSO loads and inits theUIViewcontroller
for the particular calculator that was selected, sets thedisplayedViewController
property ofUniversalScroller
to the newly loaded calculatorUIViewcontroller
, and pushes theUniversalScroller
to the front.- When the
UniversalScroller
hits its 'viewDidLoad
' event, it sets itscontentSize
to the view frame size of its 'displayedViewController
' object. It then adds thedisplayedViewController's
view as asubview
to 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
UIScrollView
from aUIViewController
whose 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