17

我正在做一个基于 UISplitViewController 的 iPad 应用程序。当我的应用在 potrait 中启动时,我的工具栏按钮有点问题。不显示显示弹出框的按钮。但是,当我将我的 iPad 旋转为横向然后返回纵向时,按钮显示!

看起来启动时未调用以下方法(这是我有显示按钮的代码):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc

应用程序启动时不会调用此方法,只有在旋转时才会调用此方法。更奇怪的是,我使用 Xcode UISplitViewController 模板 + 核心数据制作了一个测试应用程序(这与我正在开发的应用程序相似,并且是我用来制作此应用程序的模板)。在我没有编写任何代码的测试应用程序上,当我以纵向模式启动我的应用程序时,该按钮会显示,并且在启动时也会调用上述方法,而不是我的其他应用程序。有没有人有类似的问题?

最后,从苹果文档中还不清楚是否应该在首次显示 UISplitViewController 时调用此方法:http: //developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/参考.html%23//apple_ref/doc/uid/TP40009454

4

6 回答 6

23

“Kshitiz”有正确的概念。首先我在 viewDidLoad 方法中设置了 self.splitviewController.delegate = self,设置这个委托有点晚了。因此,我尝试在早期阶段设置委托,即 awakeFromNib 方法。然后它运作良好。

所以,问题是viewDidLoad已经加载了view之后,那么delegation就不起作用了,它会在一些活动(比如旋转iPad)之后工作一段时间。所以比 viewDidLoad 更早的阶段是 awakeFromNib。

这是有效的代码:

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}
于 2012-02-13T04:12:47.547 回答
1

您是否设置了 splitviewcontroller 委托?通常,当未设置委托时会出现问题。

于 2011-05-02T10:39:45.703 回答
0

我有同样的问题。我的观点是在 IB 中建立的,这似乎是一个时间问题。拆分视图委托在拆分视图通知初始方向“更改”后设置。将拆分视图添加到应用程序委托中的插座使按钮出现在我的纵向启动时,但是当我打开弹出窗口时它是空的。这可能会以某种方式解决,但我认为拆分视图在设置时没有通知其代表当前方向是很奇怪的。

于 2011-07-04T08:00:26.763 回答
0

我遇到了完全相同的问题,Martin Gunnarsson 的回答让我找到了解决方案。

之前,我在委托视图(详细视图)已经加载后设置 UISplitViewController 的委托属性,在viewDidLoad:. 此时,UISplitViewController 已经发送了初始splitViewController:willHideViewController:withBarButtonItem:forPopoverController:消息。我只是没有尽快设置代表。

解决方案是在主应用程序委托中分配委托,在application:DidFinishLaunchingWithOptions:. 在这种情况下,我的委托包含在导航控制器中,因此我必须更深入地挖掘一层才能获得它。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController;
    return YES;
}
于 2011-11-11T17:18:52.947 回答
0

这也让我省心,因为我正在使用开箱即用的 splitViewController 处理两个 iPad 项目,第一个总是显示“主”按钮,而第二个从来没有。我比较了outlets和relationships和delegate,直到我对眼,但最终在appDelegate中找到了答案。原来我在 application:didFinishLaunchingWithOptions: 中注释得太多了,特别是 splitViewController.delegate 的设置位置。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

将此添加到 appDelegate 可以使您不必为 splitViewController 子类化。我也尝试在 IB 中连接代表,但由于某种原因,它不会有这些。故事板设计缺陷,恕我直言。

于 2012-05-08T09:57:57.900 回答
0

我被困在这个问题上很长一段时间了。终于让它工作了。awakeFromNib 对我不起作用。didFinishLaunchingWithOptions 做到了。可能是因为我正在运行一些查询来填充弹出控制器中的项目。

于 2012-08-30T02:03:53.740 回答