I've got a split-view application. When in Portrait orientation, there is a popover, it has a title "Root View Controller", how can I change it? moreover, how to skip popover when I select a cell? thanks. Here is the screenshot:
in the ViewController set
self.navigationItem.title = #"The text you want";
and to "skip" the popover when a row is selected do sometime like this
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self.navigationController dismissModalViewControllerAnimated:YES];
}
Find the view controller that will be the master view in the UISplitViewController and set the title in the viewDidLoad method like this:
self.title = #"Set Title";
Since the master view will eventually modify the detail view you can place a method in the detail view controller to dismiss the UIPopoverController after you select a row. Below is an example.
So in DetailViewController(Detail View) implement a method like this
- (void)setDetailDescription:(NSString *)text {
// Put code to update the detail view here
[self.popoverController dismissPopoverAnimated:YES];
}
And then in your RootViewController(Master View) implement this code
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *dc = [self.splitViewController.viewControllers objectAtIndex:1];
[dc setDescription:#"Update detail view"];
}
Take note that your setup will vary so you will have to adapt this code to your project.
Related
I am working in a table view app using story board . I want to perform event on selection
of cell in table view . So when I select a cell element , a next view(detailview) should be
open for displaying further details .
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.dv = [[Detail alloc]initWithNibName:#"Detail" bundle:nil];
dv.dic = [self.arr1 objectAtIndex:indexPath.row];
[self.view addSubview:dv.view];
}
Instead try this:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.dv = [[Detail alloc]initWithNibName:#"Detail" bundle:nil];
dv.dic = [self.arr1 objectAtIndex:indexPath.row];
[self presentViewController:dv animated:YES completion:nil];
}
And if you want to dismiss use this code:
[self dismissViewControllerAnimated:YES completion:nil];
You should use a navigation controller and when selecting a row, push the detail view into it.
To create navigation controller: selected the tableview controller and go Editor / Embed in / Navigation Controller.
Then do:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// dv = [Detail alloc] initWithNibName:#"Detail" bundle:nil];
dv = [storyboard instantiateViewControllerWithIdentifier:#"DetailViewController"];
dv.dic = [self.arr1 objectAtIndex:indexPath.row];
[self.navigationController pushViewController:dv];
}
The commented line is if you're not using storyboard.
Or you can do as Abdullah suggested, but implement a dismiss button with
[self dismissViewControllerAnimated:YES completion:nil];
In the storyboard drag a segue from the viewcontroller icon at the bottom of your view to the next viewcontroller you want to segue to. Make sure that your view is embedded in a navigation controller. Press the arrow that appears between your tableviewcontroller and the target view controller and make sure you label it with a segue identifier. Then in the method you are describing make sure they selected the correct index path with an if statement and write
[self performSegueWithIdentifier:#"theNameOfYourIdentifierFromTheStoryboard"];
That being said, I think that there is a large body of information you should research.
Read this: http://www.appcoda.com/use-storyboards-to-build-navigation-controller-and-table-view/ as a start.
In viewDidLoad I add a tableview to navigationController like this :
[self.view addSubview:navigationController.view];
[self.navigationController.view addSubview:tableViewRecherchePartenaire];
When a row from tableview is selected I want this tableview to disappear and I tried something like this :
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row==0){
NSLog(#"RecherchePartenaireTypePartenaireViewController...");
[self.navigationController.view removeFromSuperview];
recherchePartenaireTypePartenaireViewController=[[RecherchePartenaireTypePartenaireViewController alloc] init];
recherchePartenaireTypePartenaireViewController.recherchePartenaireViewController=self.view;
[self.navigationController pushViewController:recherchePartenaireTypePartenaireViewController animated:YES];
[recherchePartenaireTypePartenaireViewController release];
}
}
but the tableview disappear but the next view is not appear. How can I use the table view with the navigationController ? Please help...I spent a lot of time with this and I can see the mistake..Thanks in advance..
First of all, you must not add subview to UINavigationController's view. Put your UITableView in a subclass of UIViewController and make it the rootViewController of your navigationController. You can do it in your main xib file or programmatically :
navigationController.rootViewController = myTableViewController;
After you can almost keep your function :
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row==0){
NSLog(#"RecherchePartenaireTypePartenaireViewController...");
recherchePartenaireTypePartenaireViewController=[[RecherchePartenaireTypePartenaireViewController alloc] init];
[self.navigationController pushViewController:recherchePartenaireTypePartenaireViewController animated:YES];
[recherchePartenaireTypePartenaireViewController release];
}
}
But this function will be in myTableViewController.
In your code, you were removing your navigationController's view from the view hierarchy. So it's normal that nothing came up when you were pushing something, because UINavigationController handle push by pushing the next controller's view on it's own view.
Here is a nice Apple's sample that could help you :)
http://developer.apple.com/library/ios/#samplecode/TheElements/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007419
In your code uitableview is not a navigation type view.So,When you are adding the UITableview to the navigationcontroller's view,superview is uitableview.Ans in didselectrowAtIndexPath you are pushing on the UITableview but not on the NavigationController.So make the UITableview as navigationtype.And then add it to navigationController.And do the same whatever you did.
I have problem with hiding tabbar .
this my code
//this created in the Delegate.m file
-(void)HideTabBar
{
mTabController.hidesBottomBarWhenPushed =YES;
}
//Now i want to this on the cell select Tab bar must hide when it go to the map view (other view ) for that i use this but its working
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
JourneyAppDelegate * journey = (JourneyAppDelegate *)[[UIApplication sharedApplication]delegate];
[journey HideTabBar];
}
But
it work how can do this
mTabController will not get invisible/hidden until you push it for Example:
//this created in the Delegate.m file
-(void)HideTabBar
{
mTabController.hidesBottomBarWhenPushed =YES;
[self.navigationController pushViewController:IncomingViewController animated:YES];
}
//Now i want to this on the cell select Tab bar must hide when it go to the map view (other view ) for that i use this but its working
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
JourneyAppDelegate * journey = (JourneyAppDelegate *)[[UIApplication sharedApplication]delegate];
[journey HideTabBar];
}
You need to set hidesBottomBarWhenPushed property to the UIViewController that is going to be pushed before you call pushViewController.
As the method suggests, it works only as the view controller is pushed onto the stack. So instead of trying to hide it in the view controller, where the table view is, just add the line
[mapController setHidesBottomBarWhenPushed: YES] to wherever you create that map controller.
Hope you understand my workings.
How can I pass the first tableview row data to second detail view row
I use
[cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
or
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
to show up disclosure button in each cells
it can ,I also add actions in
- (void)tableView:(UITableView *)tableViewaccessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
NSLog(#"disclosure button %# touched",indexPath.row);
}
But when I touch the disclosure button I got nothing shows up in console
Than I add actions in
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// carry Alarm Name text into sub-table-view to look for detail time and text info
NSLog(#"Alarm Name = %#", [alarmName objectAtIndex:indexPath.row]);
NSLog(#"Index Path Raw# = %i", indexPath.row);
// Navigation logic may go here. Create and push another view controller.
AlarmDetailTableViewController *detailViewController = [[AlarmDetailTableViewController alloc] initWithNibName:#"AlarmTableViewController" bundle:[NSBundle mainBundle]];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
detailViewController = nil;
}
It can notified on console mode
But I think it always appear the same detail view when I touch any rows in First Level TableView
How to show a new detail view with data from Level one ?
for example
To make the tableView1.row0.text = detail view.title
and show other data under the title
if you need the code I can upload it
my boss said it's not big secret inside...
Thanks a lot
Perhaps the problem is with your:
- (void)tableView:(UITableView *)tableViewaccessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
which should be reading:
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
Ok,if you tapped on accessory button than show another detail view
we need to add a detail view
First create a "new navigation based application",ex FirstView
right click on the class folder and choice "add new File" choice a new view you wanna display
ex I selected a new tableview named "DetailView"
than first go to the DetailView.m go give a section and row numbers
or declare the layout
than back to FirstView.h
add #import DetailView
go to FirstView.m
find this method - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
and use DetailView sub class to create a new view
add the codes like this
DetailView *detailView =[[DetailView alloc]init];
detailView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self.navigationController pushViewController:detailView animated:YES];
you can add any view you want to display
I am doing a book kinda application using a viewBased application. The mainView acts as the backgroundView for loading pages. Each page is a different view and have its own nib. When i swipe on a page(actually on the mainView which have loaded the current view/page), that page will be removed and the next/previous page will be added.
[currentPage.view removeFromSuperview];
[self.view insertSubview:nextPage.view atIndex:0];
I have added a popoverController with a barbutton in this mainView. Its intialized with a tableviewController class named popClass. PopClass is another UITableViewController class which will act as the parent for the popViewController.
self.myPopController = [[PopController alloc] initWithStyle:UITableViewStylePlain];
self.myPopOverController = [[UIPopoverController alloc] initWithContentViewController:myPopController];
When I select certain row in the popover, I want the backgroundview(mainView) to load the page corresponding to the number of the row.
For that I have written a function in bookView(mainView) Controller class. And is calling it from the popOver's parent class when i select certain row.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger toPageNumber = indexPath.row + 1;
[viewController changeToPage:toPageNumber];
}
Function and the lines of code are executing but nothing is happening. Even the log lines are printed but no action takes place. The code is the same for removing a page and adding another page which is working successfully when i swipe the view/page.
What is the problem? OR is there anyother way to make the view change in mainView by using the popover?
You need to have refernce of the background view controller in the popover controller.
In the PopController controller you should have a delagate like:
#interface PopController: UITablViewController{
//// other varibales;
id delegate;
}
#property (nonatomic, retain) id delgate;
Now from the class in which you are showing the popovercontroller
you should add this line:
[myPopController setDelegate:self];
Then you can easily acces any method of the main view controller class. By using
[delegate callTheRequiredMethod];
Hope this helps.
Thanks,
Madhup
It's hard to tell what's going wrong without looking at the code. That said, here's what I'd do:
(1) When a row is selected in mainView, present the popoverController modally:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
PopoverViewController *vc = [[PopoverViewController alloc] init];
[self.navigationController presentModalViewController:vc animated:YES];
[vc release];
}
(2) When something changes in the popoverController, for example a row is selected, set a value in the parentViewController (which should be the MainView):
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.parentViewController.value = someValue;
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
(3) Dismiss the popoverController where-ever you choose by calling:
[self dismissModalViewControllerAnimated:YES]`