将 NEXT 按钮添加到 iPad UISplitViewControl

Posted

技术标签:

【中文标题】将 NEXT 按钮添加到 iPad UISplitViewControl【英文标题】:Adding a NEXT button to an iPad UISplitViewControl 【发布时间】:2011-04-27 00:08:08 【问题描述】:

简单的问题(没错!)。我想在我的 iPad 项目的 UISplitViewController 的详细信息页面上添加一个“下一步”按钮。如果单击,这将是前进到页面列表中的下一页的另一种方式。作为奖励,我想突出显示根视图中与您登陆的新视图相对应的正确行。

任何关于去哪里的一般指导和建议都很棒!

更新:感谢 Anna 在下面的建议,这是我用来将所有这些组合在一起的代码。效果很好。谢谢安娜。

在详细信息页面上,我添加了以下内容:

- (IBAction)goToNext
    NSLog(@"Going to Next from Welcome");
    [[NSNotificationCenter defaultCenter]
     postNotificationName:@"NextPageRequested" object:nil];


在我做的 RootViewController 页面上:

- (void)viewDidLoad 
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(moveOnToNextPage:)
     name:@"NextPageRequested" object:nil];

最后在 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】:

实现这一点的一种方法是使用NSNotificationCenter

viewDidLoad 中的根视图控制器将调用 addObserver:selector:name:object: 以使自己成为名为 @"NextPageRequested" 的通知的观察者。

点击详细视图上的按钮时,将调用postNotificationName:object: 请求根视图控制器转到下一页。

在根视图控制器中,通知处理程序方法将(假设根视图控制器是 UITableView):

使用UITableView的indexPathForSelectedRow获取当前索引路径 计算下一个索引路径 调用selectRowAtIndexPath:animated:scrollPosition: 突出显示该行 调用实际更改页面所需的代码(可能通过直接调用tableView:didSelectRowAtIndexPath:

【讨论】:

安娜,我想这正是我一直在寻找的方向。我会尝试听从您的建议,看看会发生什么。 @AnnaKerenina 你太棒了。我的应用程序现在运行良好! Nit: viewDidLoad 可能会为单个 VC 调用多次,例如,如果视图被卸载然后重新加载。因此,必须小心何时/何地addObserver:... 我通常在initWith...addObserver:...dealloc 中的removeObserver:self;否则,您将面临在多个viewDidLoads 之后收到多个调用的风险(例如,到nextPage)。这也是一种需要调试的东西!【参考方案2】:

给你的detailviewcontroller一个父导航控制器并通过导航项将你的下一个按钮添加到导航栏。按 Next 将触发一个 pushviewcontroller 到 nav-stack。

或者在您当前的视图控制器中添加一个顶部工具栏并将按钮放在那里。

【讨论】:

以上是关于将 NEXT 按钮添加到 iPad UISplitViewControl的主要内容,如果未能解决你的问题,请参考以下文章

尝试将共享按钮添加到 iPad 代码时,我不断收到错误消息

在 DetailViewController ToolBar for iPad 上添加工具栏项或按钮

UISearchController 中的 searchBar 在 iPad 上的拆分视图上未正确显示

将图像添加到按钮

在 iPad 的系统键盘上添加自定义按钮可以吗

如何在 UIPickerView 上添加 UIToolbar? (iPhone/iPad)