Ios 我正在尝试在选择行时将对象添加到tableview单元格中的UIStackView并将其删除-它只工作一次

Ios 我正在尝试在选择行时将对象添加到tableview单元格中的UIStackView并将其删除-它只工作一次,ios,objective-c,uitableview,uistackview,Ios,Objective C,Uitableview,Uistackview,因此,我尝试使用delegate-didselectrowatinexpath将UIDatePicker添加到UITableView单元格内的UIStackView。当我选择行并取消选择该行时,它只工作一次,不会再次重复该操作 堆栈视图位于tableview单元格内,包含一个标记。 日期选取器在场景驳接中 在-didSelectRowAtIndexPath方法中,我正在检查堆栈视图是否包含日期选择器,如果不包含,则添加它,否则删除它。它只工作一次 代码如下: #import "MyTableV

因此,我尝试使用delegate-didselectrowatinexpath将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

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

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

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

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

在调用堆栈的 removeArrangedSubview:方法,显式地从 通过调用视图的removeFromSuperview方法创建子视图数组,或 将视图的“隐藏”属性设置为“是”

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

[_extrapickerremovefromsuperview]


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

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

在调用堆栈的 removeArrangedSubview:方法,显式地从 通过调用视图的removeFromSuperview方法创建子视图数组,或 将视图的“隐藏”属性设置为“是”

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

[_extrapickerremovefromsuperview]


如果alpha是根本原因,那么在添加extraPicker时堆栈视图应该会增长,因为alpha不会更改帧大小。请在addArrangedSubview和removeArrangedSubview方法中显示代码。它们是我在UIStackView实例上调用的UIStackView的默认类方法。嘿,Narayana35,我已经解决了错误并发布了解释。如果阿尔法是根本原因,当extraPicker添加到still Stack View中时,它应该已经增长了,因为alpha不会更改帧大小。请在addArrangedSubview和removeArrangedSubview方法中显示代码。它们是我在UIStackView实例上调用的UIStackView的默认类方法。嘿,Narayana35,我已经解决了错误并发布了解释。