问题
Simple question (yeah right!). I want to add a "NEXT" button on the detail pages of my UISplitViewController for my iPad project. If clicked, it would be another way of advancing to the next page in the list of pages. As a bonus, I want to highlight the correct row that in the root view that corresponds with the new view you land on.
Any general guidance and suggestions on where to go would be AWESOME!
UPDATE: Thanks to Anna's Suggestion below, here is the code I used to pull all this together. IT WORKS GREAT. Thanks Anna.
On the details page I included this:
- (IBAction)goToNext{
NSLog(@"Going to Next from Welcome");
[[NSNotificationCenter defaultCenter]
postNotificationName:@"NextPageRequested" object:nil];
}
On the RootViewController page I did:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(moveOnToNextPage:)
name:@"NextPageRequested" object:nil];
}
And Finally later in the RootViewController:
#pragma mark -
#pragma mark The NEXT Button
// This is the Code used for the Big NEXT button. basically a Notification Center listener is set up in the view did load and when triggered by any of the buttons, this
// function is called. Here, I do 3 things: 1. advance the highlighted cell of the master table view. 2. call the didSelectRowAtIndexPath function of the table to
// advance to the next page. and 3. Exchange the "dash" icon with the "check" icon.
-(void)moveOnToNextPage:(NSNotification*)notifications {
NSIndexPath* selection = [self.tableView indexPathForSelectedRow]; // grab the row path of the currently highlighted item
// Change the icon in the current row:
NSString *checkImage = [[NSBundle mainBundle] pathForResource:@"checkGreen" ofType:@"png"];
UIImage *checkMark = [[[UIImage alloc] initWithContentsOfFile:checkImage] autorelease]; // Grab the checkmark image.
if (selection) {
NSLog(@"not nil");
UITableViewCell *cell1 = [self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]];
// cell1.accessoryType = UITableViewCellAccessoryCheckmark; // this is yet another way to add the checkmar, but for now, I will use Mine.
cell1.imageView.image = checkMark; // now set the icon
} else {
NSLog(@"must be nil");
NSUInteger indexArrBlank[] = {0,0}; // now throw this back into the integer set
NSIndexPath *blankSet = [NSIndexPath indexPathWithIndexes:indexArrBlank length:2]; // create a new index path
UITableViewCell *cell0 = [self.tableView cellForRowAtIndexPath:blankSet];
// cell1.accessoryType = UITableViewCellAccessoryCheckmark; // this is yet another way to add the checkmar, but for now, I will use Mine.
cell0.imageView.image = checkMark; // now set the icon
}
// Highlight the new Row
int nextSelection = selection.row +1; // grab the int value of the row (cuz it actually has both the section and the row {section, row}) and add 1
NSUInteger indexArr[] = {0,nextSelection}; // now throw this back into the integer set
NSIndexPath *indexSet = [NSIndexPath indexPathWithIndexes:indexArr length:2]; // create a new index path
[self.tableView selectRowAtIndexPath:indexSet animated:YES scrollPosition:UITableViewScrollPositionTop]; // tell the table to highlight the new row
// Move to the new View
UITableView *newTableView = self.tableView; // create a pointer to a new table View
[self tableView:newTableView didSelectRowAtIndexPath:indexSet]; // call the didSelectRowAtIndexPath function
//[newTableView autorelease]; //let the new tableView go. ok. this crashes it, so no releasing for now.
}
回答1:
One way to implement this is using NSNotificationCenter
.
The root view controller, in viewDidLoad, would call addObserver:selector:name:object:
to make itself an observer for a notification named, say, @"NextPageRequested".
The button(s) on the detail view(s), when tapped, would call postNotificationName:object:
to request the root view controller to go to the next page.
In the root view controller, the notification handler method would (assuming the root view controller is a UITableView):
- get the current index path using UITableView's
indexPathForSelectedRow
- calculate the next index path
- call
selectRowAtIndexPath:animated:scrollPosition:
to highlight that row - call the code needed to actually change the page (possibly by calling
tableView:didSelectRowAtIndexPath:
directly)
回答2:
Give your detailviewcontroller a parent navigationcontroller and add your next button to the navbar via the navigation item. Pressing Next will trigger a pushviewcontroller to the nav-stack.
Or add a top-toolbar to your current view controller and put the button there.
来源:https://stackoverflow.com/questions/5797917/adding-a-next-button-to-an-ipad-uisplitviewcontrol