UITableViewCell 中的 UIDatePicker 更新 UITableViewCell 文本标签

Posted

技术标签:

【中文标题】UITableViewCell 中的 UIDatePicker 更新 UITableViewCell 文本标签【英文标题】:UIDatePicker in UITableViewCell update UITableViewCell textlabel 【发布时间】:2015-03-01 00:50:03 【问题描述】:

我一直在经历在 UItableViewCell 中设置 UIDatePicker 的过程,当您在 UITableView 中选择任何其他 UITableViewCell 时,它会在选择其上方的 UITableViewCell 时显示出来。

我通过查阅来自其他人的大量文档以及低于平均水平的苹果UIDateCell example 创建了此代码。

到目前为止,我已经这样做了

显示和隐藏单元格 将 UIDatePicker 添加到单元格

我不知道该怎么做的一件事是,一旦日期发生变化,如何将该日期传递回 UIDatePicker 单元格上方的 UITableViewCell UILabel?

我在选择器方法中捕获日期。

这就是代码的样子。

- (void)viewDidLoad 
//.. set up view, UITableView (because its a subview to this view) delegate and data source etc then create UIDatePicker

//Get datepicker ready
    datePickerForCell = [[UIDatePicker alloc] init];
    datePickerForCell.datePickerMode = UIDatePickerModeDate;
    [datePickerForCell addTarget:self action:@selector(datePickerChanged:) forControlEvents:UIControlEventValueChanged];

//...


#pragma mark UITableViewStuff
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    [sheetsTableView beginUpdates];
    // typically you need know which item the user has selected.
    // this method allows you to keep track of the selection
    if (indexPath.section == 0) 
        if (indexPath.row == 0) 
            if (editingStartTime == true) 
                editingStartTime = false;
                [sheetsTableView endUpdates];
             else 
                editingStartTime = true;
                [sheetsTableView endUpdates];
            
        
    


//.. sections method
//.. rows method etc

//.. change height of cell that has picker in it to hide and show when needed
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    if (indexPath.section == 0 && indexPath.row == 1)  // this is my picker cell
        if (editingStartTime) 
            return 219;
         else 
            return 0;
        
     else if ((indexPath.section == 2 && indexPath.row == 0) || (indexPath.section == 3 && indexPath.row == 0))
        return 180;
     else 
        return self.sheetsTableView.rowHeight;
    



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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (indexPath.section == 0)
    
        if (indexPath.row == 0) 
            // Date
            if (cell == nil)
            
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
            
            cell.textLabel.text = @"Date";
            cell.detailTextLabel.text = @"1/2/17";
         else if (indexPath.row == 1) 
            // UIPicker
            if (cell == nil)
            
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            
            cell.clipsToBounds = YES;
            [cell.contentView addSubview:datePickerForCell];

        

//.. other cells below this


#pragma mark - datepicker
- (void)datePickerChanged:(UIDatePicker*) datePicker

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"dd MM yyyy"];


    NSString *test = [NSString stringWithFormat:@"%@",[dateFormat stringFromDate:datePicker.date]];
    NSLog(@"%@", test);


所以我的问题是,我如何将测试字符串(即使我还没有正确格式化它)传递给 indexPath (0,0) 中的 UITableViewCell UITextLabel

【问题讨论】:

【参考方案1】:

拥有一个 ivar,用于存储您要为标签指定的内容。在您的 cellForRowAtIndexPath 中,您有一个 if,where,如果 indexpath 是您将此内容分配给标签的单元格

在 datePickerChanged 中你必须完成 ivar 的内容并在 tableview 中给出一个 reloadData。

【讨论】:

天啊……真是个白痴!!!!我刚刚意识到这有多容易......我在想我必须访问某种 UIDatePicker 代表......哦,伙计,我觉得自己很愚蠢(这是 2 个月的假期剂量)【参考方案2】:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (indexPath.section == 0)
    
        if (indexPath.row == 0) 
            // Date
            if (cell == nil)
            
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
            
            cell.textLabel.text = @"Date";
            cell.detailTextLabel.text = [NSDateFormatter localizedStringFromDate:datePickerForCell.date 
                                                  dateStyle:NSDateFormatterShortStyle 
                                                  timeStyle:NSDateFormatterFullStyle];

         else if (indexPath.row == 1) 
            // UIPicker
            if (cell == nil)
            
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            
            cell.clipsToBounds = YES;
            [cell.contentView addSubview:datePickerForCell];

        

//.. other cells below this

【讨论】:

以上是关于UITableViewCell 中的 UIDatePicker 更新 UITableViewCell 文本标签的主要内容,如果未能解决你的问题,请参考以下文章

更改 UITableViewCell 中的对象也更改了重用 UITableViewCell 的对象

确定 UITableViewCell 中的 UIButton

UITableViewCell 事件中的 UIButton 不起作用

UITableViewCell 中的 UICollectionView

UITableVIewCell 中的 UIScrollView 不会滚动

UITableViewCell 中的 UITextField - UIButton