Ipad UISplitViewController在启动时不显示弹出按钮

Ipad UISplitViewController在启动时不显示弹出按钮,ipad,uisplitviewcontroller,launch,portrait,Ipad,Uisplitviewcontroller,Launch,Portrait,我正在做一个基于UISplitViewController的iPad应用程序。当我的应用程序在potrait启动时,toobar按钮有点问题。不显示显示popover的按钮。 然而,当我将我的iPad旋转到横向,然后再回到纵向时,按钮会显示出来 看起来在启动时没有调用以下方法(这是因为我有显示按钮的代码): 此方法在应用程序启动时不调用,但仅在存在旋转时调用。更奇怪的是,我使用Xcode UISplitViewController模板+核心数据制作了一个测试应用程序(与我正在开发的应用程序类似,

我正在做一个基于UISplitViewController的iPad应用程序。当我的应用程序在potrait启动时,toobar按钮有点问题。不显示显示popover的按钮。 然而,当我将我的iPad旋转到横向,然后再回到纵向时,按钮会显示出来

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

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

最后,从苹果的文档中还不太清楚,在第一次显示UISplitViewController时是否应该调用此方法:
是否设置了splitviewcontroller委托?
通常,当未设置委托时会出现问题。

我也遇到了同样的问题。我的观点建立在IB中,这似乎是一个时间问题。在分割视图通知初始方向“更改”后,将设置分割视图委托。将拆分视图添加到app delegate中的一个outlet使按钮在纵向启动时为我显示,但当我打开弹出窗口时,它是空的。这可能是可以解决的,但我觉得奇怪的是,分割视图在设置时没有通知其代理当前方向。

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

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

解决方案是在主应用程序委派中分配委派,在
应用程序: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;
}
“Kshitiz”的概念是正确的。首先,我在viewDidLoad方法中设置self.splitviewController.delegate=self,现在设置这个委托有点晚了。因此,我尝试在早期阶段设置委托,即awakeFromNib方法。那么它工作得很好

因此,问题是在viewDidLoad已经加载视图之后,委托将不起作用,它将在一些活动(如旋转iPad)后一段时间起作用。因此,比viewDidLoad更早的阶段将从NIB中唤醒

以下是有效的代码:

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}

这也让我有了更多的空闲时间,因为我正在做两个带有开箱即用的splitViewController的iPad项目,第一个总是显示“主”按钮,而第二个从来没有显示过。我比较了门店、人际关系和代理,直到我的目光交叉,但最终在appDelegate中找到了答案。事实证明,我在应用程序中的注释有点太多了: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中连接委托,但由于某些原因,它没有这些功能。情节串连板设计缺陷,imho。

我被困在这个问题上很长一段时间了。终于成功了。我的闹钟坏了。didFinishLaunchingWithOptions完成了。可能是因为我正在运行某个查询来填充popover控制器中的项目。

是的,但仅在IB中进行了设置。这是适当的设置,因为在随后的方向更改中会调用它。您是否认为,因为它是在IB中设置的,所以在视图首次出现时无法设置,然后在一段时间后正确设置。这听起来很疯狂,对我来说几乎不可能。你可以随时设置分割视图控制器的委托。你也可以将委托更改为下一个视图控制器。我已经完成了分割视图委托的更改查看示例,希望这会有所帮助。。我认为在从xib加载时设置得不够及时。请看我对这个问题的回答,这可能是重复的:终于!一如往常,一旦你知道它,它是如此明显。
- (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;
    }