更改自定义 UIView 上的选项卡

Posted

技术标签:

【中文标题】更改自定义 UIView 上的选项卡【英文标题】:Change tab on custom UIView 【发布时间】:2017-06-16 20:36:26 【问题描述】:

我基本上只需要在用户点击我的自定义 UIView 上的按钮时更改选项卡

这是我的 UIView 实现

@implementation CustomMenuView
- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 

        UIButton *searchButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 135.0, 40.0)];
        searchButton.backgroundColor = [UIColor clearColor];
        [searchButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        searchButton.titleLabel.font = [UIFont systemFontOfSize:15];
        [searchButton setTitle:@"Search" forState:UIControlStateNormal];
        searchButton.tag = 0;
        [searchButton addTarget:self action:@selector(menuItemTapped:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:searchButton];


    
    return self;


-(void)menuItemTapped:(UIButton*)sender
    self.tabBarController.selectedIndex = sender.tag;

还有我的 ViewController 类:

   UIView *menuView;

    - (void)viewDidLoad

    [super viewDidLoad];
    CGFloat height = [UIScreen mainScreen].bounds.size.height;
    menuView = [[CustomMenuView alloc]initWithFrame:CGRectMake(0, 60, 135, height)];
    [self.view addSubview:menuView];

这会崩溃,因为 UIView 没有对 tabBarController 的引用。如何在自定义视图的父级上调用方法或解决此问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

据我所知,您可以在此处使用委托模式。因此,您创建了一个名为 CustomMenuViewDelegate 的协议,并在此类型的 CustomMenuView 上声明了一个弱属性。当 menuItemTapped: 方法被调用时,您调用 CustomMenuViewDelegate 属性上的方法。您可以使您的 ViewController 符合委托协议,并在 viewDidLoad 方法中设置为委托。

【讨论】:

感谢我的支持并打赌这很好,但我决定为此使用本地通知。 当然,很高兴您找到了解决方案。请记住,将 NSNotification 用于这些事情往往被认为是一种反模式(请参阅this great post)。不过,我想真正重要的是它可以完成工作:)【参考方案2】:

我最终决定使用这样的本地通知:

在我的自定义 UIView 上

-(void)menuItemTapped:(UIButton*)sender
        NSDictionary* userInfo = @@"tab": @(sender.tag);
        NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
        [nc postNotificationName:@"MenuItemSelected" object:self userInfo:userInfo];

UIViewController 类

- (void)viewDidLoad

    [super viewDidLoad];

      [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(receiveMenuItemSelectedNotification:)
                                                     name:@"MenuItemSelected"
                                                   object:nil];
    

    -(void) receiveMenuItemSelectedNotification:(NSNotification*)notification
    
        if ([notification.name isEqualToString:@"MenuItemSelected"])
        
            NSDictionary* userInfo = notification.userInfo;
            NSNumber* tab = (NSNumber*)userInfo[@"tab"];
            NSLog (@"Successfully received test notification! %i", tab.intValue);
            self.tabBarController.selectedIndex = tab.intValue;

        
    

- (void)viewDidUnload

    [super viewDidUnload];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"MenuItemSelected" object:nil];


【讨论】:

以上是关于更改自定义 UIView 上的选项卡的主要内容,如果未能解决你的问题,请参考以下文章

反应导航选项卡导航器特定选项卡自定义

Angular Js ui.bootstrap 选项卡自定义

基于jQuery实现的Tabs选项卡自定义插件

自定义 UIView 不适合屏幕,Swift

在另一个自定义 UIView 中设置/更改嵌套自定义 UIView 的变量

使用带有选项卡布局的自定义视图时无法从选项卡中删除填充