选择按钮时隐藏视图和其他对象

时间:2014-11-14 22:46:18

标签: ios objective-c uibutton nslayoutconstraint

当取消选择按钮时,我试图隐藏其中的UIView和对象。该按钮位于同一ViewController中包含的TableView节头中。

按下按钮存储在......

Activity.h

@property BOOL invitesAll;

Activity.m

#import "Activity.h"

@dynamic invitesAll;

剩下的代码......

InviteContactsViewController.h

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *expirationViewHeightConstraint;
@property (weak, nonatomic) IBOutlet UILabel *timeToRespondLabel;
@property (weak, nonatomic) IBOutlet UISlider *expirationSlider;
@property (weak, nonatomic) IBOutlet UILabel *expirationLabel;

@property (strong, nonatomic) IBOutlet UIButton *inviteAll;

InviteesTableViewController.h

#import "InviteContactsViewController.h"

@property (weak, nonatomic) NSLayoutConstraint *expirationViewHeightConstraint;
@property (weak, nonatomic) UILabel *timeToRespondLabel;
@property (weak, nonatomic) UISlider *expirationSlider;
@property (weak, nonatomic) UILabel *expirationLabel;

InviteesTableViewController.m

#import "InviteesTableViewController.h"

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    // create button
    InviteAllButton *inviteAllButton  = [InviteAllButton buttonWithType:UIButtonTypeCustom];
    [inviteAllButton setTitle:@"Order Matters" forState:UIControlStateSelected];
    [inviteAllButton setTitle:@"Order Doesn't Matter" forState:UIControlStateNormal];
    inviteAllButton.titleLabel.font = [UIFont fontWithName:@"Avenir" size:11.0];
    inviteAllButton.titleLabel.numberOfLines = 2;
    [inviteAllButton addTarget:self action:@selector(inviteAllAction:) forControlEvents:UIControlEventTouchUpInside];
    [headerView addSubview:inviteAllButton];

    // set inviteAll button state
    inviteAllButton.selected = !_activity.invitesAll;

    // set constraints
    [inviteAllButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSDictionary *views = NSDictionaryOfVariableBindings(inviteAllButton, titleLabel);
    [headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[titleLabel]-(>=5)-[inviteAllButton(96)]-5-|" options:0 metrics:nil views:views]];
    [headerView addConstraint:[NSLayoutConstraint constraintWithItem:inviteAllButton attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:headerView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
}

- (void)inviteAllAction:(UIButton *)sender {
    sender.selected = !sender.selected;
    _activity.invitesAll = !_activity.invitesAll;
    [self validateReordering];
    [self.tableView reloadData];

    NSString *state = _activity.invitesAll ? @"invitesAll" : @"orderMatters";

    // In my attempt to hide the view, I've set an expirationViewHeightConstraint 
    // and try to change its constant as the button is pressed
    if (self.activity.invitesAll) {
        self.expirationViewHeightConstraint.constant = 0.f;
        self.timeToRespondLabel.hidden = YES;
        self.expirationSlider.hidden = YES;
        self.expirationLabel.hidden = YES;
    } else {
        self.expirationViewHeightConstraint.constant = 35;
        self.timeToRespondLabel.hidden = NO;
        self.expirationSlider.hidden = NO;
        self.expirationLabel.hidden = NO;
    }
}

我引用了Max's关于将高度约束常量更改为0.f的答案,并尝试按照Simon's答案访问ViewControllers中的属性作为基础,但无济于事。当我运行时,当按下inviteAll时,expirationViewHeightConstraint,timeToRespondLabel,expirationSlider或expirationLabel IBOutlets不会发生任何可见的事情。

我是个新人,所以我猜错了我在这里缺少一些基本的东西。我的做法有缺陷吗?

1 个答案:

答案 0 :(得分:0)

您在InviteesTableViewController中使用属性声明所做的是错误的。您不能在子控制器中声明某些属性,并期望它们指向某些其他控制器中的对象(父级或非父级)。您需要获取对父级的引用,您可以使用self.parentViewController,然后使用它访问其属性,

InviteContactsViewController *inviteVC = (InviteContactsViewController *)self.parentViewController;
if (self.activity.invitesAll) {
        inviteVC.expirationViewHeightConstraint.constant = 0.f;
        inviteVC.timeToRespondLabel.hidden = YES;
        inviteVC.expirationSlider.hidden = YES;
        inviteVC.expirationLabel.hidden = YES;
    } else {
        inviteVC.expirationViewHeightConstraint.constant = 35;
        inviteVC.timeToRespondLabel.hidden = NO;
        inviteVC.expirationSlider.hidden = NO;
        inviteVC.expirationLabel.hidden = NO;
    }

您应该删除InviteesTableViewController中的所有属性声明。