UITableViewCell detailTextLabel在为其分配新值时不会更新其文本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITableViewCell detailTextLabel在为其分配新值时不会更新其文本相关的知识,希望对你有一定的参考价值。

我一直在尝试使用静态表视图作为我的应用程序中的警报功能的设置/选项视图。我能够传递和更新各种ViewControllers和更新值的数据。

永远MPMediaPickerController将愉快地传回数据,它甚至会在保存值后使用正确的值更新委托,但在保存alarmObject之前它不会更新detailTextLabel。我可以在我的日志中看到,当ViewController被解除时,对象甚至会以正确的值保存。唯一奇怪的是,有问题的VC是另一个VC的子VC,但我不认为这是问题所在。

如果它有帮助,所有VC也是UINavigationController的一部分,但MediaPicker除外。

我试图重新加载数据,在主线程上执行更改,延迟主线程让所有更改执行,重新加载mediaCell所在的特定行,在单元格上调用needsDisplay和needsLayout以及layoutIfNeeded,没有任何作用。任何建议都非常受欢迎,因为我过去几天一直在反对这一点并且感到沮丧。

#import "AddAlarmTableViewController.h"
#import "ToneTableViewController.h"

@interface AddAlarmTableViewController ()

@property (weak, nonatomic) IBOutlet UITableViewCell *mediaCell;

@end

@implementation AddAlarmTableViewController


@synthesize previousLabel, previousSoundAsset, previousRepeatArray,alarmDelegate,mediaCell;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:NO];
    if(previousSoundAsset != nil) {
        mediaCell.detailTextLabel.text = previousSoundAsset;
    } else {
        mediaCell.detailTextLabel.text = @" ";
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if([cell.reuseIdentifier isEqualToString:@"mediaCell"]) {
        UIAlertController *selectTypeAlertController = [UIAlertController alertControllerWithTitle:@"Select Media From" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
        //Creating actions
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
        UIAlertAction *selectFromMusicAction = [UIAlertAction actionWithTitle:@"Music" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
            [self launchMediaPickerController];
        }];
        UIAlertAction *selectFromToneAction = [UIAlertAction actionWithTitle:@"Tone" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
            [self launchTonePickerController];
        }];
        //adding them to uialertcontroller;
        [selectTypeAlertController addAction:cancelAction];
        [selectTypeAlertController addAction:selectFromMusicAction];
        [selectTypeAlertController addAction:selectFromToneAction];
        [self presentViewController:selectTypeAlertController animated:true completion:nil];

    }
}
- (void)launchTonePickerController {
    ToneTableViewController *toneVC = [[ToneTableViewController alloc] init];
    toneVC.alarmDelegate = alarmDelegate;
    [self.navigationController pushViewController:toneVC animated:true];

}
- (void)launchMediaPickerController {
    NSLog(@"Launching MPMediaPickerController");
    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
    mediaPicker.delegate = self;
    mediaPicker.allowsPickingMultipleItems = NO;

    [self presentViewController:mediaPicker animated:true completion:nil];
}

//MPMediaPickerDelegate methods
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker {
    [self dismissViewControllerAnimated:true completion:^ {
        NSLog(@"MPMediaPickerController dismissed");
    }];
}
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
    MPMediaItem *selectedTrack = [[mediaItemCollection items] objectAtIndex:0];
    alarmDelegate.soundAsset = selectedTrack.title;
    mediaCell.detailTextLabel.text = alarmDelegate.soundAsset;
    alarmDelegate.appTones = [[NSNumber alloc] initWithBool:NO];
    [self dismissViewControllerAnimated:true completion:^ {
        NSLog(@"MPMediaPickerController dismissed with %@", alarmDelegate.soundAsset);
        dispatch_async(dispatch_get_main_queue(), ^ {
            [self.tableView reloadData];
        });
    }];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"repeatSegue"]) {
        DayTableViewController *daysViewController = segue.destinationViewController;
        daysViewController.alarmDelegate = alarmDelegate;
        if(previousRepeatArray != nil) {
            daysViewController.previousSelection = previousRepeatArray;
        }
    }
    else if([segue.identifier isEqualToString:@"labelSegue"]) {
        LabelViewController *labelViewController = segue.destinationViewController;
        labelViewController.alarmDelegate = alarmDelegate;
        if(previousLabel != nil) {
            labelViewController.previousLabel = previousLabel;
        }
    }
}
@end
答案

请检查previousSoundAsset的值。它可能是空字符串(不是nil)。

if(previousSoundAsset != nil || ![previousSoundAsset isEquals:@""]) {
    mediaCell.detailTextLabel.text = previousSoundAsset;
} else {
    mediaCell.detailTextLabel.text = @" ";
}
另一答案

好的,正如Apple的文档所示,如果您正在使用故事板和静态表视图,建议只需将IBOutlet附加到相关项目并使用IBOutlet直接设置所述项目的属性,在这种情况下, detailTextLabel。我仍然不知道为什么我不能通过didSelectRow UITableViewDelegate中返回给我的单元格直接更改detailTextLabel但是你去了。

我怀疑当我尝试在主线程上的GCD块中时,我没有尝试执行此操作,因此也是如此。请注意,实际延迟发生的时间有可察觉的延迟,因此请注意这一点。

以上是关于UITableViewCell detailTextLabel在为其分配新值时不会更新其文本的主要内容,如果未能解决你的问题,请参考以下文章

突出显示的 UITableViewCell 和选定的 UITableViewCell 有啥区别?

斯威夫特 - UITableViewCell?不能转换为 UITableViewCell

UITableviewcell的性能问题

UITableViewCell 上的动画按钮而不影响其他 UITableViewCell

如何制作一个继承自另一个 UITableViewCell 的 UITableViewCell?

iOS开发UI篇—UITableviewcell的性能问题