Ios 如何在启动时设置静态UITableViewCell的alpha?
我正在制作一个应用程序,它有一个设置页面。对于设置页面,我使用带有静态UITableViewCells的UITableViewController。我正在使用NSUserDefaults存储设置 现在,这是设置视图控制器: 根据SettingsTableViewController.m中viewDidLoad函数中的代码,应该对保存的设置进行检查,根据这一点,通知间隔单元格的alpha属性应该更改。如果我在tableView:didSelectRowAtIndexPath方法中执行此操作,则效果很好,但是,它在viewDidLoad方法中不起作用。以下是消息来源:Ios 如何在启动时设置静态UITableViewCell的alpha?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我正在制作一个应用程序,它有一个设置页面。对于设置页面,我使用带有静态UITableViewCells的UITableViewController。我正在使用NSUserDefaults存储设置 现在,这是设置视图控制器: 根据SettingsTableViewController.m中viewDidLoad函数中的代码,应该对保存的设置进行检查,根据这一点,通知间隔单元格的alpha属性应该更改。如果我在tableView:didSelectRowAtIndexPath方法中执行此操作,则效果
#import "SettingsTableViewController.h"
@interface SettingsTableViewController ()
@end
@implementation SettingsTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Check if setting is already saved.
if ([defaults stringForKey:@"notification"]) {
self.notificationTableViewCell.detailTextLabel.text = [defaults stringForKey:@"notification"];
// Disable the interval cell, if the notifications are turned off.
if([[defaults stringForKey:@"notification"] isEqualToString:@"Off"]) {
self.intervalTableViewCell.alpha = 0.439216f;
self.intervalTableViewCell.userInteractionEnabled = NO;
}
} else {
// If no setting is saved, reset to default settings.
self.notificationTableViewCell.detailTextLabel.text = @"On";
[defaults setObject:@"On" forKey:@"notification"];
[defaults synchronize];
}
// Check if setting is already saved.
if([defaults stringForKey:@"interval"]) {
self.intervalTableViewCell.detailTextLabel.text = [defaults stringForKey:@"interval"];
} else {
// If no setting is saved, reset to default settings.
self.intervalTableViewCell.detailTextLabel.text = @"5 min";
[defaults setObject:@"5 min" forKey:@"interval"];
[defaults synchronize];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Get selected cell.
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
// Reset the state of the cell.
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
if(cell == self.notificationTableViewCell) {
if([cell.detailTextLabel.text isEqual: @"On"]) {
cell.detailTextLabel.text = @"Off";
[[NSUserDefaults standardUserDefaults] setObject:@"Off" forKey:@"notification"];
self.intervalTableViewCell.alpha = 0.439216f;
self.intervalTableViewCell.userInteractionEnabled = NO;
} else {
cell.detailTextLabel.text = @"On";
[[NSUserDefaults standardUserDefaults] setObject:@"On" forKey:@"notification"];
self.intervalTableViewCell.alpha = 1.0f;
self.intervalTableViewCell.userInteractionEnabled = YES;
}
} else if(cell == self.intervalTableViewCell) {
NSArray *possibleTimes = @[@"1 min", @"5 min", @"10 min", @"30 min"];
int indexOfCurrent = 0;
for (int i = 0; i < possibleTimes.count; i++) {
if([self.intervalTableViewCell.detailTextLabel.text isEqualToString:possibleTimes[i]]) {
indexOfCurrent = i;
}
}
// Return to the starting value of the array.
if(++indexOfCurrent == possibleTimes.count) {
indexOfCurrent = 0;
}
self.intervalTableViewCell.detailTextLabel.text = possibleTimes[indexOfCurrent];
[[NSUserDefaults standardUserDefaults] setObject:possibleTimes[indexOfCurrent] forKey:@"interval"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
- (BOOL)prefersStatusBarHidden {
return YES;
}
@end
首先,作为NSString比较方法,您应该使用以下方法:
isEqualToString:
而不是
isEqualToString:
第二件事是,您发现所选单元格是否是要检查的单元格不是最好的主意,我的意思是:
if(cell == self.notificationTableViewCell)
不要那样做——你会很快发现自己陷入巨大的麻烦中。
正确的处理方法是使用枚举,并根据indexPath节、行值切换大小写。否则,您将保留对某个内存单元所在位置的引用,但该单元将通过UITableView的队列机制被重用,用于不同的行-因此,您将在此处的末尾保留对随机单元的一些随机引用
对于alpha问题,我认为应该在DidSelectRowatineXpath方法中同步NSUserDefaults之后重新加载表数据。
使用UITableView中的重新加载数据方法,或者最好只重新加载您知道在单击“优化版本”时将要更改的部分,但您可以从重新加载整个表开始。将更改单元格alpha属性的代码移到视图生命周期中稍后出现的方法中。一个很好的尝试方法是查看将出现:。您能再明确一点您的问题吗?当视图出现时,您的问题alpha是否未应用?在viewDidLoad中是否self.intervalTableViewCell==nil,因为您首先在CellForRowatineXpath中构造它?@Niko是的。如果打开应用程序并切换“通知”按钮,则当设置为“关闭”时,“通知间隔”单元格将变灰。但是,同样的事情在viewDidLoad中不起作用。@MacDonald这是否相关?这些细胞是静止的。此外,还可以从viewDidLoad本身更改.userInteractionEnabled属性。只是alpha没有改变。你能给我们看看你的cellForRowAtIndexPath代码吗?