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 viaUITextFields 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 theUIViewcontrollerfor the particular calculator that was selected, sets thedisplayedViewControllerproperty ofUniversalScrollerto the newly loaded calculatorUIViewcontroller, and pushes theUniversalScrollerto 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开发者_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
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
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).
加载中,请稍侯......
精彩评论