gpt4 book ai didi

ios - 在 UITableViewCell 中不断更新 UISlider

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:24:28 26 4
gpt4 key购买 nike

我希望将 UISlider 用作“Audio VU Meter”类型的指示器,其中音轨的电平不断更新 UISlider 的值。我的应用程序中的每个轨道当前都位于一个 UITableViewCell 中,VU Meter 是单元格内容 View 中的一个 subview 。一次显示多达 12 个轨道。

VU 表的更新是通过 TCP/IP 端口进行的,所以一旦我收到新的 VU 级别并设置推子值 (mySlider.value = newValue)。但是,让 slider 立即更新的唯一方法是调用 performSelectorOnMainThread:@selector(reloadData) withObject:myTableView waitUntilDone:NO。似乎我不应该重新加载整个表的数据。

代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
TrackTableCell *cell = (TrackTableCell *)[tableView dequeueReusableCellWithIdentifier:@"TrackTableCell"];

if(cell == nil)
{
[[NSBundle mainBundle] loadNibNamed:@"TrackTableCell" owner:self options:nil];
cell = [self trackTableCell];

/**************************/
/********* FADER *********/
/**************************/
VolumeSlider *fader = [[VolumeSlider alloc] initWithFrame:CGRectMake(0, 0, 265, 30)];
[fader setRotatedThumbImage:[UIImage imageNamed:@"FaderCap.png"]];
[fader setRotatedMinTrackImage:[UIImage imageNamed:@"VolumeSlider.png"]];
[fader setRotatedMaxTrackImage:[UIImage imageNamed:@"VolumeSlider.png"]];

[fader addTarget:self action:@selector(volumeFaderSliderAction:) forControlEvents:UIControlEventValueChanged];

fader.value = 0;

// rotate the slider
fader.transform = CGAffineTransformMakeRotation(-M_PI_2);
[cell.contentView addSubview:fader];

fader.bounds = CGRectMake(0, 0, 265, 30);
fader.center = CGPointMake(70, 515);

// property of the cell
cell.volumeSlider = fader;
}


// set the slider to 0
cell.volumeSlider.value = [[self.tracks objectAtIndex:indexPath.row] volume];

return cell;
}

通过数据模型 ([[tracks objectAtIndex:trackNumber] volume]) 已更新的通知调用以下方法。

- (void) updateVolumeFader:(NSNotification *)note
{
NSDictionary *extraInfo = [note userInfo];
int trackNumber = [[extraInfo objectForKey:@"trackNumber"] intValue];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:trackNumber inSection:0];

TrackTableCell *cell = (TrackTableCell *)[self.tracksTableView cellForRowAtIndexPath:indexPath];

cell.volumeSlider.value = [[tracks objectAtIndex:trackNumber] volume];
}

在查看代码时,我猜测这是我获取单元格指针的方式。我猜调用 cellForRowAtIndexPath 不是最好的方法。此外,我刚刚意识到调用 cellForRowAtIndexPath 本身应该将推子更新为 tracks 数组中的新值。

正如所建议的那样,也许最好保留我所有轨道的 slider (或我所有单元格,就此而言)的缓存数组。虽然这肯定不是最高效的代码,但我仍然不明白为什么它不起作用?

最佳答案

如果您的通知未在主线程中传递,则更新 slider 的代码将无法运行。您的通知方法中的代码在其他方面都很好;只需将它放在一个 block 中并在主线程上执行,或者在注册通知时在主线程(操作队列)上注册。

关于ios - 在 UITableViewCell 中不断更新 UISlider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com