Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在启动时设置静态UITableViewCell的alpha?_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 如何在启动时设置静态UITableViewCell的alpha?

Ios 如何在启动时设置静态UITableViewCell的alpha?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我正在制作一个应用程序,它有一个设置页面。对于设置页面,我使用带有静态UITableViewCells的UITableViewController。我正在使用NSUserDefaults存储设置 现在,这是设置视图控制器: 根据SettingsTableViewController.m中viewDidLoad函数中的代码,应该对保存的设置进行检查,根据这一点,通知间隔单元格的alpha属性应该更改。如果我在tableView:didSelectRowAtIndexPath方法中执行此操作,则效果

我正在制作一个应用程序,它有一个设置页面。对于设置页面,我使用带有静态UITableViewCells的UITableViewController。我正在使用NSUserDefaults存储设置

现在,这是设置视图控制器:

根据SettingsTableViewController.m中viewDidLoad函数中的代码,应该对保存的设置进行检查,根据这一点,通知间隔单元格的alpha属性应该更改。如果我在tableView:didSelectRowAtIndexPath方法中执行此操作,则效果很好,但是,它在viewDidLoad方法中不起作用。以下是消息来源:

#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代码吗?