Is there a different implementation to avoid my long switch statement? - ios

In my iOS app, I have a view containing around 33 buttons (I'm creating an interactive map). Each button corresponds to a building. And each button I want to modally present a different view controller based on the selected button.
So my first thought was to tag all the buttons, and create a 33 case long switch statement. Looking at my code, there has to be a better way to do it, but my brain isn't coming up with the solution. Any advice?

Use the button tag as the index into an array giving you the configuration for the view to show.
If you are using different view controller classes for the presentation of some buildings then you can have an identifier (or, if you want, the class name) in the configuration.

Related

Show two view components in one controller but from two files (xib/storyboard)

I would like to implement something like below:
But, I would like to have my first version app without the map, later on, I will add the map. So, the eventual goal is to show both map and the other things showing on above screen.
My question is, how to make it happen? It sounds like I should have the map and the rest UI in two files (xib or storyboard) respectively, then later on, combine them together. But I am not sure what is the right way to implement these things in iOS?
Can I implement a view component which only contains map, then, another view component only contains the rest, then later on, combine them & one UIViewController associate with the combined view? If so, how to do it? If not, what is the correct way to achieve this?
I think you can achieve that by using container views; add 2 container views to your view controller in your Storyboard, the upper container view will contain the map and its stuff, and the bottom one will contain anything else.
To hide the first container view in your first version of the app you'll only need to set the height constraint of the upper container view to 0 after setting the other constraints properly.
If you wanted to use a view controller from another Storyboard file, you can check my answer here.

Same View in different view controllers?

I have a view like this:
Each one of the buttons has an action to do when I click on them. And these buttons are changing dynamically through coding (if statements...), when I click some button it leads me to other different buttons values..also the Label is changing accordingly.
ITS LIKE A QUIZ KIND OF THING!
What I want is when I click a button , It should lead me to a different layout of the (view buttons) ( area ).
I was thinking of adding a new view controller for each of what I want to do but this could mean 100 view controllers! I don't know if this is the right way to do it. Is there a better way?
First I'd find similarities between your desired layouts. Implement one view controller making all of those similarities happen. For instance:
show a label on top
show four buttons below
step back and forth between layouts
show different kinds of buttons according to their description
Then you can initialize your view controller with a description of your questions, potential answers/buttons and behavior for each button. Let's say it's a quiz. So you create a class Quiz containing an array of Questions. Each Question contains the question it self as a String and a description for each of the four buttons. It could be the shape and color or a text/answer. And of course some sort of actions for the buttons. It could be just as mutch as a boolean state or a more complicated enum. You get the picture?
(My answer seems to be as vague as your question.)
In the end you'll have to write the whole description for your requirements. I'd write this into a txt, csv, plist, json (whatever is convenient writing and parsing for you) and parse it. That would be the fewest code.

Storyboards: How do I use the same view controller in several places?

For years, I've hand-coded my view code for iPhone apps, but now I'm giving storyboards another look.
One common pattern in my code is to use the same view controller in two places, but with slight UI variations. For example, when browsing a list of brands (BrandListController), I'd like to show a table view of all brands in the system; tapping a brand shows you its products. But when filtering items by brand, I'd like to show a table view of brands (with the same content and same cell appearance), but I'd like tapping a row to take you back to the filter screen instead of showing you that brand's items. I'd also like a "Search" bar button item in the top right.
It's easy to make these things happen in code, by just adding a boolean member variable so the controller can be configured before it's presented.
But how would I do this with storyboards? I could have multiple controllers segue to the same instance of BrandListController, but again, I would want the controller to have different behavior and include/exclude UI elements based on how it's used. It seems like a bad idea to create two separate instances of BrandListController in the storyboard, because then I would have to duplicate all the outlet connections and I would have to keep changes in sync. But what are my other options?
The thing to realise with Storyboards is that you don't necessarily have to only use a single storyboard.
You can use multiple storyboards or use them in conjunction with nibs etc...
However, in this case what you could do is still use you boolean property on the controller.
Then in the prepareForSegue method of the other controllers you can set this boolean property to change the behaviour. You might even have a couple of nibs that defines a small section of UI to place into the view depending on the property.
I've done stuff like this to pass blocks into view controller too.
For example...
I had a "User Search" controller that had a default behaviour of if you tap a user it will push to that user's profile page.
But I could pass in a code block that would, for instance, dismiss the search controller and I use the selected user to create a new message to them (or whatever). Or something else entirely depending on the code block I passed in.
EDIT
LOL, just re-read your question. What I did with the blocks would work for you too. I created a block property called userTappedBlock or something. If that exists then I run it when the cell is tapped. If not I do the default behaviour.

Using a tabbar for controlling the tableview data in iOS without using storyboards

I am building an app which mainly shows a tableview. In this tableview I have some custom table rows. The table rows are filled with data received from the server. I receive multiple kinds of data from the server. I will store it in arrays.
For example, I've got three kinds of arrays. Each is filled with different kinds of data received from the server. See below:
(NSArray*)carList_
(NSArray*)motorcycleList_
(NSArray*)bicycleList_
The actual program that I've got now, only shows the carList in the tableview. Foreach car in carList, there is a table row.
The thing that I've in mind to do is a little bit tricky. I want to add a tabbar at the bottom of the screen with three buttons. When I press the first button, I want the table to be filled with the carList. When I press the second button, I want to fill the table with the motorcycleList. And when I press the third button, I want to fill the table with the bicycleList.
As you can see, I will use the same tableview. I will only refill it with the data I want to see. Is this allowed in iOS? Cause I read something about that the tabbar is for multiple views, and I only want to use it for changing the data in my table. Only the fourth button I've planned for future development will open a new view. If it is not allowed, what is a good alternative do do it? Buttons maybe? I searched the web for what I want to do, but it seems that my idea has never been used before, I think my idea is not allowed in iOS.
At this moment I've a initialViewController (with almost no code cause it is used only to initialize some things of the server. It acts like a splash screen) and I've got a rootViewController which does the works. In the rootViewController I've got my Table with Table rows and it has the different arrays of data which are retrieved by a method that is called when the rootViewController is loaded.
I am programming without Storyboards, because I'd like coding and I want to understand how it works 'underground'. What is a good way to implement the tabbar if it is allowed what I want to do with it? I don't think a standard tab controller will work, because I am working with only one view.
Of course you can use the UITabBar solution. However this might be not very useful and this is not the idea behind the UITabBar. You can instantiate the same TableViewController vor each tab. In this case you can use the same class but you have up to the instances of this class when the user cycles through the tabs. This will be obvisously a waste of memory.
Your descriptions sounds like a UIToolBar with a UISegmetenControl in it might fit your needs better. You can also place it at the bottom of the screen and you will need just one TableViewController for your data.
UISegmentedControl is designed for switching between different data representations. It is also commonly used for switching between table datasources. But it often appears at the top of a view. Take a look at Top Charts tab of App Store app.
Tab bar is designed to present different views for each tab. Here are progress steps to achieve your result:
Use different instances of table view controller for each tab
Configure each instance for displaying one particular array, depending on tab position
Keep arrays in external (outside table view controller) storage, instances should have an access to it
It's better to preload data, while user is examining an active tab. Hence, load data outside of table view controllers, possibly in AppDelegate. Use notifications to update table view when data are available.

iOS - UIPopOverController - Dynamic Menu?

I know UIPopOverController can give a standard drop down but I'm curious if it can do a dynamic drop down.
The Dynamic drop down would take it one step further and clicking on any item in the list could expand out more options or preform some other action, similar to how file menus behave.
If any examples exist that would be appreciated.
There's no compelling reason why not, but you'd just have to write it all yourself (in a table view or otherwise). Popover controllers are just containers for view controllers: write a view controller that does what you want, and you're set.

Resources