将在Interface Builder中创建的UITabBarController设置为委托

时间:2013-08-11 19:07:22

标签: iphone ios delegates uitabbarcontroller

我用Tab Bar模板创建了我的iOS应用程序,所以这里是带条形按钮的UITabBarController。问题是如何将其设置为委托。我发现它必须在AppDelegate中以编程方式设置,但我认为这是不可能的,因为我无法访问Tab Bar Controller作为插座。

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

@interface ViewController : UIViewController <UITabBarControllerDelegate>

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

我想让它委托创建像这样的tab select事件:

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

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

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

  1. 创建一个新类:

    class TabBarControllerDelegate:NSObject,UITabBarControllerDelegate {

  2. 在IB中,将对象库中的对象添加到左侧的View Controller列表中(注意:搜索&#34;对象&#34;,它是黄色立方体)。

  3. 将此对象的类(IB中的黄色多维数据集)更改为TabBarControllerDelegate

  4. 在IB中导航到标签栏控制器场景。从Connection Inspector中,将委托圈拖到您在步骤3中添加的新对象。

  5. 在TabBarControllerDelegate类中实现委托方法。完成!

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

    }

答案 1 :(得分:5)

我不记得确切地设置了Xcode的标签栏模板,但在您的AppDelegate中,您可以访问窗口的rootViewController,将其转换为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;

答案 2 :(得分:5)

0行代码

拖动一个Object并将其子类化

IB Object

  1. Xcode&gt;显示文件检查器&gt;自定义类。
  2. 班级TabBarControllerDelegate
  3. 将委托设置为该对象

    Link to object in IB

    将现有代码放入该对象

    这是您当前UITabBarControllerDelegate已拥有的代码。

    class TabBarControllerDelegate: NSObject, UITabBarControllerDelegate {
        // Delegate code goes here
    }
    

答案 3 :(得分:3)

如何创建viewController让我们说MyTabController子类UITabBarController

@interface MyTabController : UITabBarController<UITabBarControllerDelegate>

并将您storyboard中的标签Controller类设置为MyTabController而不是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;