I need to create a multiple columned table which has independent scrolling for each view. Each column will contain sections that can be expanded to hold line items. All columns may not contain an equal number of sections. I was wondering what will be the best way to approach this.
I would recommend have each table view be contained in their own UITableViewController. Then you can use a container controller to display each table view controller in as subviews.
See: Creating Custom Container View Controllers
The advantage of this approach is that you can create a generic container view that only needs to worry about the location and sizing of the sub-view controllers. Each sub-view controller could worry about their own content. Thus you could have sub-view controllers be table view controllers, navigation view controllers or whatever you need at the time.
It sounds as though your columns won't really have anything to do with one another.
If so, just create three tableViews, and give each their own datasource and delegate.
Related
I have an application where every view controller subclasses from BaseViewController (A custom view controller that subclasses from UIViewController). I need to differentiate the subviews of a certain view controller's view from each other, from the BaseViewController. The application is pretty huge and each subview doesn't necessarily have a tag. What other ways are there to differentiate the sub views?
The application is pretty huge and each subView doesn't necessarily have a "tag". What other ways are there to differentiate the subViews?
That's exactly what the tag property is for -- differentiating between views that are otherwise similar, like each button in an array of buttons. You should only need to differentiate between the subviews managed by a single view controller at any given time; any given view should only be known by the view controller that manages its parent view, so the size of the app really doesn't change the tag property's utility.
The other obvious way to tell the difference between views is to use the fact that they're distinct objects, each with its own address. For example, say you've got a bunch of similar views representing people on a seating chart, and you want to keep track of which view goes with each person in the chart. One way to do that is to have your view controller maintain a NSDictionary where the keys are people and the values are the views.
XIB and Storyboard files are just XML. You could write a script to load the XML, put in tag attributes and save. The XML element name tells you what kind of view it is (button, imageView, etc).
Alternatively, if you can have different tags on each load, you can just programmatically tag the subviews in viewDidLoad
I have seen questions asked about mutliple UITableViews in one view but they all have only one table visible at a time. I am after something different please.
In my head I want four UITableViews visible in one UIScrollView inside one UIView. The four tables will be visible and populated at once. They will have a dynamic number of rows each so the scroll view will allow users to scroll off of the page to see rows that do not fit.
The tables would be two side by side and then below them the next two side by side so that you end up with a 2x2 square.
I can (sort of) wrap my head around how to code this in the controllers etc. but I cannot figure out how to organise the hierarchi. I have tried using the storeboard to layout the tables inside the view but 9 out of 10 attempts to drop controls in fail as I am obviously not fully understanding this.
Do I need to generate the UITableViews in the UIViews implementation file and add them as objects to the UIView? Or can I use the Storyboard?
Could someone please explain how the hierarchi of objects would be structured?
In my head it would be:
UIViewController
-> UiView
---> UIScrollView
------> UITableView
------> UITableView
------> UITableView
------> UITableView
But trying this in Storyboard doesn't work. I assume each UITableView will want its own UITableViewController and what I have read in other posts I would likey need to do this connecting in the UIViewController implementation file.
Any help is appreciated.
I think you might try to drag UITableViewController into your view Controller, at least I don't have that problem to add 4 table view into a scroll view.
here is how i added it
1.> Drag the scroll view control into view controller
Your view controller should look like this:
2.> Drag the table view control into the scroll view, and set the size and position of that table view
Your view controller should look like this:
3.> Then drag all the rest 3 table views onto Scroll view
But i would like to suggest a couple of things in your case
no using that much table view in the same view controller, it's a chaos in your codes to maintain all them. There are always better
options than 4 table view, maybe consider collection view. or even
separate the use flow.
If i were you, i won't use table view inside Scroll view, they are like scroll view inside scroll view, if you don't design the
interaction very very well, they become extremely hard to use.
If you still want to use four table view in the same view controller after all, you want to pay extra attentions on your table view datasource and delegate. very carefully handle all the cases.
Hope that helps you.
Tableviews are very customized scrollviews. I wouldn't put 4 of them on a scrollview, this wouldn't be very intuitive for the user as your finger would scroll the view in many ways depending on where exactly it touches the screen.
Instead, try having your 4 tableviews in a 2x2 pattern directly onto a simple UIView. This can be done inside the Storyboard.
As for filling up and using them, you have 2 ways :
A) Your UIViewController is the delegate and datasource of each of the 4 tableviews. When executing, you perform a switch on the first parameter (the tableview that called you) to determine the appropriate course of action.
B) You create 4 classes that each handle a single tableview, instanciate 4 objects inside your UIViewController and assign the UITableviews' delegate and datasource properties to these objects.
All technicality aside, 4 tableviews in a single screen is pretty crowded. Your design will definitely not fly on a iPhone, so I'm assuming iPad only. Even then, you should make sure that everything is visually appealing and the purpose of each control is clear. It's up to you, but I'd hate to see you work hard on an application only to see your efforts wasted because your visual design doesn't appeal to your users.
If the table views take up the entire region of the scroll view then they wont let any scroll events past to the scroll view that contains them, unless the scroll is horizontal.
For a simple one to one between a table view and a view controller, I would make each table view part of it's own UITableViewController (so you have four), and then make a UIViewController that adds each of the UITableViewControllers to it as a child.
This way you don't have to do any fancy logic around if statements on which tableview is asking for data, because the table view controllers only have one table view.
https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html
I have an application that is working quite well, but the customer wants to combine two of the views (UIViewControllers) in to a single view (a Split View Controller).
The master part of the view will be a table with a list of Staff in a TableView, and the detail view will be made up of two Table Views - one that contains details about the member of staff (name, phone, ext, office etc) and the other with training records (courses, qualifications and so forth).
When you click on the master table, it selects the detail records for the given member of staff and displays them in the detail view.
I have no storyboard in the application, and use [self presentViewContoller] to switch from view to view (because there is a lot of conditional processing on what view is required and a storyboard seemed to be too restrictive)
However I have tried the following :-
Creating a SplitViewController (right click, New File, UISplitViewController), but it seems to be empty with no master or detail views. Also, when I try to make it appear, it either doesn't appear, or causes it to crash (tried to present a SplitViewController modally).
Creating a "fake" split view controller, by putting two views on a normal view controller, then putting the required tables inside them. However I can not find a way to present any borders or the like, and the whole thing looks a tad unprofessional and stupid.
So my question is basically this :-
Is it possible to create SplitViewControllers in single view projects, and use them?
Or, if not, is it possible to put borders around views, or tables, or draw a single straight line on a view?
(If at all possible, I would prefer not to have to rewrite my entire application and just add this SplitView controller or the "fake split view Controller")
You can use container views:
Create a new root view controller and add two container views to it. This will create two embed segues that you can point to the view controller's whose views you want to appear in these containers.
You cannot control two UIViewController simultaneously.
So, try displaying two UIView or subclasses of UIView like UITableView.
Displaying Two UITableView is a little tiresome.
Take a look at this question Two UITableView in the same view
As for borders around views, you can put UIImageView or something as border lines.
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(159, 0, 2, 640)];
I am using ECSlidingViewController, a library that gives a side-drawer effect. My application opens to a (navigation controller holding a) table view controller of 'Nearby' results, and the cells segue to a scroll view controller.
The hidden left menu is a table view controller (of different class) with a few options, 2 of which are other table view controllers that will use the same layout, cell prototypes, and detail scroll view as the table view seen on startup.
I would like to know if it would be better design to make a more generic tableView with some sort of property like an enum'd typeOfDisplay, which lets me conditionally manage different nuances like populating cells from server/CoreData, navbar titles, sort order, toggling auto-updating, editability, etc. - OR - if I should make a NavigationController->TableViewController->ScrollViewController for each different view controller (A 'Nearby', 'Featured', and 'Saved')
I'd like to reuse my table view because the cells/display/detail will be identical, but the methods for populating the table are different, and I don't want to make something that's difficult to modify.
Edits -
If you are familiar with table views inside tab-bar contollers, the implementation details should be nearly the same.
It's better to put view configuration into view controller. But there can be ways to reuse the configuration actions.
I have ran into the same situation like yours. And I decided to use Strategy Pattern to refactor my controllers. I put all the data related stuff into a TableDataManager class which conforms to the UITableViewDataSource and UITableViewDelegate protocols and I applied polymorphism to it to configure the data in cells and the appearance of the UITableView under different circumstances at runtime.
All the identical actions are implemented in TableDataManager, and nuances are overridden by subclasses of TableDataManager. By assigning a proper subclass of TableDataManager to a view controller, there is no need for you to copy and paste the identical cells/display/detail actions here and there.
That's my experiences. Hope it will help.
I would recommend you to use different view controllers for different datasources. It sounds good initially to put them all together in one place, but as time goes by, you may need to add different functionalities to each table view, and your view controller will be a horrible mess.
I have a SQLite project in IOS for Ipad. the database contains one table with a lot of products. what I want to do is separate this products into categories. so that i can make a separate tableview for each category. So my question is, can I use one table view with different sections, but put this sections side by side horizontally? The application only work on landscape mode. I hope the question is clearly enough. Thank's.
You can achieve this using a UICollection view (iOS6+ only, but there is an open source back-port here), or you can roll your own using scroll views.
The collection view scrolls horizontally, and has a number of items matching the sections in your catalogue.
Each cell of the collection view contains a header and a table view, holding the detail from the appropriate section.
Use child view controllers to keep your code clean - the view for each cell should be managed by its own view controller, which doesn't need to know it is in a collection view cell.