0

所以我正在尝试使用委托 -didSelectRowAtIndexPath 将 UIDatePicker 添加到 UITableView 单元格内的 UIStackView。当我选择行并取消选择该行时,它可以工作但只工作一次并且不会再次重复该操作。

堆栈视图位于 tableview 单元格内并包含一个标签。日期选择器位于场景码头中。

在 -didSelectRowAtIndexPath 方法中,我正在检查堆栈视图是否包含日期选择器,如果不添加则删除它。它只工作一次。

以下是代码:

 #import "MyTableViewController.h"

@interface MyTableViewController ()
@property (strong, nonatomic) IBOutlet UIDatePicker *extraPicker;
@property (nonatomic, strong) UIStackView *stackView; //tag 100

@end

@implementation MyTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = 44;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

}

#pragma addPickerViewToStackView

-(void)addPickerViewToStackView{

    [_stackView addArrangedSubview:_extraPicker];
}

#pragma mark - remove picker
-(void)removePickerFromStackView{

    [UIView animateWithDuration:0.4
                     animations:^{ [_extraPicker setAlpha:0];
                         [_extraPicker.widthAnchor constraintEqualToConstant:self.view.frame.size.width].active = true;
                         [_stackView removeArrangedSubview:_extraPicker];
                         [self.tableView layoutIfNeeded];
                     }];
}




#pragma mark - picker date changed
-(IBAction)pickerValeChanged:(id)sender{
    [self.tableView reloadData];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section == 0) {
        return 3;
    }else if (section == 1){
        return 1;
    }
    return 0;

}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"otherCell" forIndexPath:indexPath];
    cell.textLabel.text = @"Starts";

    if (indexPath.row == 2) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"pickerCell" forIndexPath:indexPath];
        _stackView = (UIStackView*) [cell viewWithTag:100];
        return cell;
    }

    return cell;
}


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [self.tableView beginUpdates];
    [_extraPicker setAlpha:1];

    if (indexPath.row == 1) {
        if ([_extraPicker isDescendantOfView:_stackView]) {
            [self removePickerFromStackView];
        }else if (![_extraPicker isDescendantOfView:_stackView]){
        [self addPickerViewToStackView];
        }

    }


    [self.tableView endUpdates];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}


@end
4

2 回答 2

3

在阅读了 Apple 网站上的 UIStackView 文档后,我了解了以下重要信息:

此方法从堆栈的排列子视图数组中删除提供的视图。视图的位置和大小将不再由堆栈视图管理。但是,此方法不会从堆栈的子视图数组中删除提供的视图;因此,视图仍然显示为视图层次结构的一部分。

为了防止视图在调用堆栈的 removeArrangedSubview: 方法后出现在屏幕上,请通过调用视图的 removeFromSuperview 方法从子视图数组中显式删除视图,或者将视图的隐藏属性设置为 YES。

所以我的错误是没有从 superView 中删除 _extraPicker。在 -removePickerFromStackView 中添加此代码后,一切正常。

[_extraPicker removeFromSuperview];

于 2015-11-24T11:58:29.973 回答
0

您在删除时添加了 [_extraPicker setAlpha:0],请确保在添加时为您的视图设置了所需的 alpha。

于 2015-11-24T11:12:01.783 回答