Search Display Controller tableview - uitableview

I have a Search Bar and Search Display controller that I dragged from the Objects list on the right of Interface Builder. I placed this object on my DetailViewController's view. I set the delegate to be the DetailViewController. I have code in the DetailViewController to supply an NSArray of searched results to the tableview that shows up when text is typed in the search bar. Basically, the search bar is on top of the DetailView of a Master/Detail view....
Everything is working fine except how do I get access to the tableview so that I can graphically design the tableview and cells in the Interface Builder storyboard? I would like as much as possible to avoid designing views programmatically.

The search display controller's table view doesn't exist until your app runs and the search takes place! So there's nothing to design until then. You can't set the search display controller's searchResultsTableView; you can only read it, so obviously you'll have to do that in code.

Related

Using a UITableView to populate a UITabBar

I am converting my single view application into one that is based on tabs. I have most of the layout done so I'm trying to wire up all the components now and I'm stuck trying to figure out how to do two things:
When I pick a bonus from my UITableView, I want it to open my 2nd tab with the info for the selected row. I'm not sure how to do that.
If I go straight to one of the other tabs, I want to have it just display the details for the first visible row of the UITableView. I'm not sure how to set such a default value.
I'm not exactly sure what code you would need to see for the above, but I am using Xcode 9 and Swift 4. I've googled and searched YouTube and Stack Overflow, and the answers are either all for Objective-C or are about the UITabBar obscuring the last row of UITableView data (which is not an issue I'm having).
EDIT: I seem to have semi-gotten it to work by changing my prepare (for segue) and then via Interface Builder, deleting the segue from the UITableView to the tab's viewController. However, this still doesn't light up the proper tab in the UITabBar. Also, this is still wrapped in the original Navigation Controller. Which allows me to move back and forth, but isn't the intent. When I tried removing the Navigation Controller, I had to use a "Show" or "Modal" type segue, which covers up the UITabBar, and offers no way to get back out of the detail view. I want to use the UITabBar to provide the back and forth that the Navigation Controller used to handle so I can gain the space at the top of the screen back.
The simplest is probably to register a Notification Center observer in your second tab's view controller. Whenever you have an item to show, simply trigger the notification from your first tab's view controller attaching the object you need to show to the notification.

Using RealmSearchViewController with a UITableView

I'm developing my first app in swift, which has a table that shows data stored using Realm. I've managed to add stuff to the Realm and show it in a table. Afterwards I wanted to add search capability and stumbled upon these two guides: http://www.raywenderlich.com/81615/introduction-to-realm and https://realm.io/news/building-an-ios-search-controller-in-swift/. I would like to use RealmSearchViewController, but I can’t seem to fit it to my setup. I tried using a UITableViewController embedded in a Navigation Controller, but I need a button at the bottom of the screen, where the user should tap to add an entry to the list. I tried using a tableFooterView with a button, but it can only stick to the bottom of the table and not the bottom of the screen. I also tried using a Tool Bar and a Tab Bar in the Navigation Controller, but it doesn’t show as the table takes up the whole screen.
What I would like to achieve is something like Airmail for iPhone, where there’s a Tab Bar at the bottom that is hidden when the user scrolls. Above the Tab Bar I’d like a table with content from the Realm, and then a Search Bar, which is directly below the Navigation Bar. I’d like to use RealmSearchViewController as it makes searching a lot easier, but how can I adapt it to be used with a Table View and not a Table View Controller?
Any other suggestions as to how I can achieve the same functionality?
Thanks!
My recommendation would be to create a parent view controller that arranges the the view of RealmSearchViewController so that it doesn't cover the entire screen, and then arrange a UIButton at the bottom.
You can do this in a Xib/Storyboard by arranging a view and a button with autolayout and then simply add the view from RealmSearchViewController as a subview to the view in this parent view controller.

Adding TableViews to TabBarView & how to customise prototype cell

Im building my iphone application and this is how my storyboard looks right now.
First question: Adding another table view
My first two tab bar items are going to contain table views. Now as you can see i have my first table view connected and all, how would i do to get the empty view under Navigation Controller to be a a Table View. Would i need to add another Navigation controller? or how does it work cause i have never worked with tabbars/tableviews before.
Second question: Customize prototype cell
My first Table View can show the data that i inputed as you will see in the following picture. The first picture is how its currently being shown. How can i make a custom prototype cell that would look like the second picture?
Please not that the cells will be very much alike each other in both of my table views. I will have an if statement where i will check a specific thing and if its true it will hide for example the image but all the other things would be the same so would i make a class for the cells?
For better solving your questions, You must first understand the purpose of Navigation Controller. Navigation Controller is there for you to push and pop between controllers, which is convenient when you have levels of data. It manages a stack of controllers. You don't always need a navigation controller to work with tableview. However, it's a common practice to put Navigation controller and TableView (with view controller or solely UITableViewController) together for easy showing levels of data.
Basically, there are two ways to add a TableView. You can directly drag a table view onto your empty view controller or delete the empty VC, then drag a UITableViewController. Most importantly, select the whole VC and go to Editor (at the top) choose embed in a Navigation Controller.
Link about navigation controller from Apple's document
Since you use storyboard, you can directly customize your tableViewcell in storyboard. You already have a prototype cell. You can now directly drag UIImage or Label on that. Most importantly, create a class subclassing UITableViewCell and connect objects in your tableViewCell as an IBOutlet so that you can control it. If you feel plain text explanation is not enough, I find a tutorial for you.
You could refer to the link section Prototype Cells.
1) Yes you will need a 2nd navigation controller for each tab.
Delete the UIViewController.
Drag a UITableViewController to the storyboard.
Embed the UITableViewController in a NavigationController.
Set a segue from the tab bar button to the new NavigationController.
2)
To fully set up the prototype cell you showed you will need to create a new class which subclasses UITableViewCell and then set IBOutlets for all the labels etc.

Designing view on top of multiple embed views

I have the task to design a application that has a main view which is always visible (it has a button on it's bottom side, and when pressed a image displays on top of all views), and a set of TableControllerView's that should appear under it, and the user needs to be able to navigate through them.
I know that you can embed a view inside another, but you cannot refer more than one view to it. The current way I'm trying to do now load one TableViewController inside the embed view, and when the user clicks the cell I manually load the other controller and add it as a child of the main view, which is the RootViewController. The problem with this approach is that the navigation bar gets stuck using the root view controller, so I have to manipulate the main navigation items on each subview transition, and second is that the frame for the second view I load is coming as it had full size, making some cells be under the main view button. This way doesn't uses segues for transition, so it makes the storyboard kinda useless.
I was thinking into using a TabViewController with it's tab hidden, but wanted to ask here for a better solution.
As you discovered, a TableViewController likes to fill up the whole screen (except navigation bars, tab bars, status bar, etc. which are official Cocoa Touch GUIs). When you want a table view to fill only part of the screen, you are supposed to use a UITableView but not a UITableViewController. You set your custom view controller object (subclass of UIViewController, not UITableViewController) as the table view delegate and data source. You will need to duplicate part of the functionality of UITableViewController in your custom view controller, but it's not a lot more than you have to do already to supply the data.
You should probably follow the standard design pattern and have separate view controller objects for each of the "pages" the user can navigate to. You just have a main button and image on each of them. But I could imagine why that might not give you exactly the effect you want.

Tab bar items are the same except for their data set in storyboard

I've set up a storyboard with a UITabBarController object and I'd like to add two tabs to that, but both tabs are going to be exactly the same except for the data they will display. Obviously, I could drag in two new view controllers and connect them up and just maintain the views separately, but I don't want to do this at all.
Does anyone know the most efficient way of doing this?
I've done this by using a regular UIViewController with a tab bar at the bottom, rather than using a UITabBarController. You just have to use the UITabBar delegate method, tabBar:didSelectItem:, to detect the tab clicks, and then do whatever you need to do to switch what data is displayed in the single view.

Resources