IOS:来自tableviewcontroller的UITabBarControllerDelegate方法

Posted

技术标签:

【中文标题】IOS:来自tableviewcontroller的UITabBarControllerDelegate方法【英文标题】:IOS: UITabBarControllerDelegate Methods from tableviewcontroller 【发布时间】:2017-02-08 13:38:25 【问题描述】:

我正在尝试使用 tabbarcontroller 的委托方法之一从嵌入 tabbarcontroller 的视图控制器中检测对另一个选项卡的点击。但是,我很困惑这些方法是否可以在单个视图控制器中,或者它们是否必须在 uitabbarcontroller 类中。我希望将它们放在可以访问这些 VC 的所有属性和局部变量的视图控制器中,而不是在 tabbarcontroller 类中。

我也对如何设置委托感到困惑。

在 tabbarcontroller 中嵌入的 tableview 控制器中,我声明了委托协议,然后包含以下代码。但是,该方法不是射击。可以将此委托方法放在 VC 中吗?如果可以,我应该如何以及在何处设置委托以使其触发?

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

    NSLog(@"DIDSELECTVC FIRED");
    NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
    NSLog(@"controller title: %@", viewController.title);

    if (viewController == tabBarController.moreNavigationController)
    
        tabBarController.moreNavigationController.delegate = self;
    

【问题讨论】:

我发现创建UITabBarController 子类并在那里处理方法更容易。见this answer。 【参考方案1】:

正如 Toru Furuya 所说,实现 UITabBarControllerDelegate 的更好方法是在 UITabBarController 本身的子类中。

如果您想使用某些内部视图控制器作为委托,请使用 tabBarController 属性:

- (void)viewDidLoad 
    [super viewDidLoad];

    self.tabBarController.delegate = self;

【讨论】:

这成功了。这是一个专门的用例。如果我将委托方法放在 tabbarcontroller 中,那么我将不得不访问单个控制器中的一堆属性和逻辑,所以在这种情况下,我认为非常规使用是合理的。【参考方案2】:

只要符合 UITabBarControllerDelegate 协议,您可以使用单独的 ViewController 或 UITabBarController 本身进行委托。

我认为将 UITabBarController 本身(或另一个专用类)用于 UITabBarControllerDelegate 比子 ViewControllers 更常见,因为您只能设置一个委托。但是如果你想使用单独的 ViewController,我希望这段代码对你有帮助。

@implementation MyTabBarController : UITabBarController

- (id)initWithCoder:(NSCoder *)aCoder
    self = [super initWithCoder:aCoder];
    if (self) 
        MyTableViewController *controller = [[MyTableViewController alloc] init];
        controller.tabBarItem = ...
        _delegate = controller;  //Set individual ViewController to UITabBarControllerDelegate
        [self setViewControllers:@[controller] animated:YES];
    
    return self;


@end

MyTableViewController 是:

@interface MyTableViewController : UITableViewController<UITabBarControllerDelegate>
@end

@implementation MyTableViewController

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
    //Handle tap event of UITabBarController

@end

【讨论】:

以上是关于IOS:来自tableviewcontroller的UITabBarControllerDelegate方法的主要内容,如果未能解决你的问题,请参考以下文章

来自 tableViewController 子类的 UINavigationController pushViewController

如何通过来自同一个 TableViewController 的多个 segue 到同一个 ViewController

iOS - CoreData - TableViewController - NSInvalidArgumentException',原因:'+entityForName: nil 不是合法的 NSM

ios 7 TableViewController 单元格无法完全显示

如果当前视图是 tableViewController,iOS TableView 不会重新加载

使用 pushViewController 加载 TableViewController 后没有发生 Ios-Segue 到 UIViewController