iPhone/Obj-C: Accessing a UIScrollView from a View displayed within it
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开发者_StackOverflow 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
If you have the particular calculator view, you should be able to get to the scroll view via the superview
property (though there might be more than one intermediate view, so you might need the superview of the superview).
精彩评论