2011-05-02 40 views
17

我正在做一个基于UISplitViewController的iPad应用程序。当我的应用程序在potrait中启动时,我遇到了toobar按钮有点问题。不显示用于显示弹出窗口的按钮。 但是,当我将iPad旋转到风景然后回到肖像时,按钮显示!UISplitViewController在启动肖像时不显示弹出按钮

它看起来像下面的方法不叫上发布(这是是我有一个显示按钮的代码):

- (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/Reference.html%23//apple_ref/doc/uid/TP40009454

+0

请参阅我的回答这个问题,这可能是一个重复:http://stackoverflow.com/questions/9411571/uisplitviewcontroller-willhideviewcontroller-willshowviewcontroller-not-called-a/12923909#12923909 – avance 2012-10-16 21:49:57

回答

23

“Kshitiz”有正确的概念。首先,我在viewDidLoad方法中设置self.splitviewController.delegate = self,设置此委派的时间稍晚。所以,我试图在awakeFromNib方法的早期阶段设置委托。然后它运作良好。

所以,问题出现在视图已经被viewDidLoad加载后,那么代理将无法工作,它会在一些活动(如旋转iPad)后工作一段时间。所以比viewDidLoad更早的阶段是awakeFromNib。

这里是工作的代码:

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

终于!一如往常,一旦你知道它就很明显。 – 2013-01-22 14:41:00

1

您是否设置了splitviewcontroller委托? 一般问题出现在未设置委托时。

+0

有,我有,但只在IB。这是适当的设置,因为它在随后的方向变化中被调用。你认为这是因为它是在IB中设置的,它可能在视图第一次出现时不能设置,然后在一段时间后正确设置。这听起来很疯狂,对我来说几乎是不可能的 – rpechayr 2011-05-02 11:52:36

+0

你可以随时设置分割视图控制器的委托,你可以改变委托给下一个视图控制器too.i已经完成了分割视图委托的改变检查示例希望这将有助于..http://kshitizghimire.com.np/uisplitviewcontroller-push-viewcontroller-in-master-and-detail/和http://kshitizghimire.com.np/uisplitviewcontroller-multipledetailviews-with-navigation-controller/ – 2011-05-03 06:39:30

+0

我认为从xib载入时没有及时设置。 – 2011-11-04 19:31:58

0

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

0

我的确遇到了同样的问题,Martin Gunnarsson的回应让我想到了解决方案。

之前,我在代理视图(详细视图)已被加载后,在viewDidLoad:中设置UISplitViewController的委托属性。此时,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; 
} 
0

这促使我不遗余力为好,更何况我工作的两个iPad的项目外的现成splitViewController,第一个总是显示'主'按钮,而第二个按钮从来没有。我比较了商店和关系以及代理人,直到我成为了对手,但最终在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中的委托,但由于某种原因,它不会有任何。故事板设计缺陷,恕我直言。

0

我被困在这个相当长的一段时间。最后让它工作。 awakeFromNib不适合我。 didFinishLaunchingWithOptions做了。可能是因为我正在运行一些查询来填充popover控制器中的项目。

相关问题