7

我使用 Tab Bar 模板创建了我的 iOS 应用程序,所以这里是带有条形按钮的 UITabBarController。一个问题是如何将其设置为委托。我在 SO 发现它必须在 AppDelegate 中以编程方式设置,但我相信这是不可能的,因为我无法访问选项卡栏控制器作为出口。

我为(ViewController 和 AppDelegate)添加了适当的值@interface,但不知道下一步该做什么。

@interface ViewController : UIViewController <UITabBarControllerDelegate>

我希望我不必摆脱整个应用程序模板,并且可以将在 IB 中创建的选项卡栏控制器设置为委托。

正是我想让它委托在选项卡选择事件上创建,如下所示:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;

任何的想法?

4

4 回答 4

8

您可以快速轻松地创建一个新的 TabBarController Delegate 类并将其连接为故事板中的委托。

  1. 创建一个新类:

    类 TabBarControllerDelegate:NSObject,UITabBarControllerDelegate {

  2. 在 IB 中,从对象库中添加一个对象到左侧的 View Controller 列表中(注意:搜索“对象”,它是一个黄色的立方体)。

  3. 将此对象的类(您在 IB 中的黄色立方体)更改为 TabBarControllerDelegate

  4. 在 IB 中导航到您的选项卡栏控制器场景。从 Connection Inspector 中,将代理圈拖到您在步骤 3 中添加的新对象上。

  5. 在 TabBarControllerDelegate 类中实现您的委托方法。完毕!

    func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController)->Bool {
       println("Selected a new tab")
    

    }

于 2015-07-05T16:49:55.237 回答
6

我不记得确切的 Xcode 的 Tab Bar 模板设置,但是在您的 AppDelegate 中,您可以访问您的 window rootViewController,将其转换为 a UITabBarController,然后将其委托设置为您的 AppDelegate 或任何其他视图控制器。

像这样的东西:

UITabBarController *tabBarController = 
    (UITabBarController *)[[self window] rootViewController];
[tabBarController setDelegate:self]; // In this example your app delegate would implement the UITabBarControllerDelegate protocol.

编辑

如果要将 ViewController 实例设置为委托:

UITabBarController *tabBarController = 
        (UITabBarController *)[[self window] rootViewController];
// I assume you have your ViewController instance set as the first view controller of your tab bar controller
// No need for a cast here since objectAtIndex: returns id, but of course you must implement the UITabBarController protocol in your ViewController.
    [tabBarController setDelegate:[[tabBarController viewControllers] objectAtIndex:0]]];

编辑 2 从您的 ViewController 本身,您可以将标签栏控制器的委托设置为 rdelmar 注释。请记住,这不能在 init 方法中完成,因为视图控制器尚未在选项卡栏控制器中。正确的位置是viewDidLoad,但因此在 ViewController 视图加载之前不会执行...

self.tabBarController.delegate = self;
于 2013-08-11T19:22:33.890 回答
5

0行代码

拖动一个对象并将其子类化

IB对象

  1. Xcode > 显示文件检查器 > 自定义类。
  2. TabBarControllerDelegate

将委托设置为该对象

链接到 IB 中的对象


将现有代码放入该对象

这是您当前UITabBarControllerDelegate.

class TabBarControllerDelegate: NSObject, UITabBarControllerDelegate {
    // Delegate code goes here
}
于 2015-09-04T04:57:06.603 回答
3

创建一个viewController让我们说MyTabController子类怎么样UITabBarController

@interface MyTabController : UITabBarController<UITabBarControllerDelegate>

并将您的标签控制器的类设置storyboardMyTabController而不是UITabBarController,然后放入 self.delegate = self;您的viewDidLoad

实施:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;

你来了。

编辑:

如果你觉得self.delegate = self;很奇怪,确实是这样,你可以在你的MyTabController

IBOutlet UITabBarController *tabBarController; and connect it to the tab controller in your storyboard.

然后你可以把tabBarController.delegate = self;

于 2013-08-11T19:15:49.123 回答