【问题标题】:iPhone - presentModalViewController via UITabBarItem and dismissModalViewController cleanlyiPhone - 通过UITabBarItem 和dismissModalViewController 干净地呈现ModalViewController
【发布时间】:2011-01-13 13:50:41
【问题描述】:

我有一个tabBarController,我通过将以下代码添加到其中:

AppDelegate.h:

    ...
    UITabBarController IBOutlet *tabBarController;
}

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

AppDelegate.m:

    ...
   [self.window addSubview:tabBarController.view];
   [self.window makeKeyAndVisible];
   [tabBarController setDelegate:self];

然后我使用下面的代码来呈现一个模态条码扫描视图控制器:

- (void)tabBarController:(UITabBarController *)tbc didSelectViewController:(UIViewController *)vc {
        // Middle tab bar item in question.
        if (vc == [tabBarController.viewControllers objectAtIndex:2]) {
           ScanVC *scanView = [[ScanVC alloc] initWithNibName:@"ScanViewController" bundle:nil];

           // set properties of scanView's ivars, etc

           UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:scanView];

           [tabBarController presentModalViewController:navigationController animated:YES];
           [navigationController release];
           [scanView release];
        }
    }

当它真正呈现出来时,我认为这种方法在视觉上并不吸引人,因为当我关闭模态视图时,我会回到一个空视图。

例如,许多条码扫描应用程序或仅显示图像选择器的应用程序;非常成功地做到这一点。我只是想知道他们会使用什么样的实现来达到这样的效果。

这是一个名为 Path 的应用程序的屏幕截图,它具有我所追求的完全相同的功能:

我还注意到,在这些应用程序中,如果您在中间的选项卡栏项目之外的任何其他选项卡栏项目上,并且您单击显示模式视图的选项卡栏项目,一旦它被关闭它就不会实际上将它们带回一个空视图,它会像平常一样关闭它,但是永远不会选择呈现模态视图的实际标签栏项目。如果这是实现这种效果的唯一方法,我会对这种功能感到满意。

任何帮助将不胜感激,因为我已经被困了很长一段时间了。此外,我什至不确定将所有这些代码放入我的AppDelegate 是否是正确的方法,以便将视图控制器呈现为模式。这一切似乎都错了。

【问题讨论】:

  • 我想你会发现 Path 应用正在使用他们自己的标签栏控制器实现。即不是来自 Cocoa Touch 的UITabBarController

标签: iphone objective-c uiviewcontroller uitabbarcontroller uitabbar


【解决方案1】:

不完全是我所追求的,但我认为我可以从这个出发:

http://idevrecipes.com/2010/12/16/raised-center-tab-bar-button/

【讨论】:

    【解决方案2】:

    当您关闭模态视图控制器时,告诉标签栏选择最初选择的任何标签。

    - (void)dismissModalViewControllerAnimated:(BOOL)animated
        {
            // do whatever you need to do when dismissing
    
            // savedTabIndex is an int ivar
            // tabBarController is a reference, set when showing the modal view
            [[self tabBarController] setSelectedIndex:savedTabIndex];
        }
    

    您必须将原始选项卡栏选择保存在tabBarController:didSelectViewController: 开头的变量中。

    - (void)tabBarController:(UITabBarController *)tbc
     didSelectViewController:(UIViewController *)vc
    {
        // Save the tab bar index (if it's not the photo tab)
        if ([tabBarController selectedIndex] != 3]) {
            savedTabIndex = [tabBarController selectedIndex];
        }
    }
    

    这段代码可能有错误,我只是输入它没有测试。

    【讨论】:

    • 注意:不要忘记包含 UITabBarControllerDelegate :)
    【解决方案3】:

    我通过玩UITabBarControllerDelegate 找到了一个非常简单的解决方案——不过我只在 iOS 7 中尝试过。

    首先,子类UITabBarController,使其成为自己的UITabBarControllerDelegate,并创建一个属性,该属性将包含对您要启动模式的选项卡的引用。在我的应用中,它被称为“销售”标签。

    @property (strong, nonatomic) UIViewController *sellTab;
    

    然后,在您的 init 方法中,创建该视图控制器并将其添加到选项卡中。

    _sellTab = [[UIViewController alloc] init];
    _sellTab.title = @"Sell";
    self.viewControllers = @[homeTab, historyTab, _sellTab, bookmarksTab, profileTab];
    

    现在神奇的地方在于:覆盖以下标签栏控制器委托方法。代码是不言自明的。

    #pragma mark - Tab bar controller delegate
    
    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
    {
        return viewController != self.sellTab;
    }
    
    - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
    {
        if (item == self.sellTab.tabBarItem) {
            [self presentViewController:[[UINavigationController alloc] initWithRootViewController:[[PostAdViewController alloc] init]] animated:YES completion:nil];
        }
    }
    

    这将启动一个模式,该模式在关闭时会显示您在启动前所在的同一选项卡。

    【讨论】:

      【解决方案4】:

      当用户点击标签栏项目时,您不应该呈现模式视图。

      您可以改为从由其中一个选项卡呈现的视图中呈现模式视图。

      或者,如果您只有一个主视图和想要以模态方式呈现的扫描视图,您应该只使用一个按钮从主视图中呈现扫描视图。例如,您可以使用带有单个按钮的工具栏。

      【讨论】:

      • 看看我所追求的功能,例如 Path 和 Stickybits。
      • 在我原来的问题中查看上面的屏幕截图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多