在seque期间丢失的修改按钮图像

时间:2013-12-25 19:16:36

标签: ios image button

我有三个场景(viewControllers)通过模态segues链接(我不想要导航控制器)。视图有一系列按钮,每个按钮最初都带有红灯图像。单击时,它们将转到下一个场景,其动作可能会影响前一场景中的图像,使其成为黄色或绿色光图像。

如果通过setImage以编程方式更改按钮图像,则稍后再次单击该按钮时,按钮图像将始终恢复为初始红光图像。同样,如果我更改场景2上的按钮图像,返回场景1,然后再返回场景2,按钮将恢复为默认值,而不是保留上一个按钮图像状态。

所以,两个基本问题是:

  1. 如何防止按钮图像在单击时更改回默认值。
  2. 如何让访问过的场景记住以前的设置,而不是在第二次访问时返回初始设置。
  3. 谢谢, 射线

2 个答案:

答案 0 :(得分:1)

如果您正在使用模态转换,则需要使用dismissViewControllerAnimated:completion:来取回。我猜这是你从VC1推送到VC​​2,然后推送VC1的新副本以便返回,这是错误的。

答案 1 :(得分:0)

1个问题:请显示更改图像的代码,其中包含mb问题。

2个问题:我对第二个问题的回答是为你的按钮状态做一个经理,例如如下:

·H

NS_ENUM(NSInteger, LightState) {
    LightStateRed,
    LightStateYellow,
    LightStateGreen
};

@interface LightManager : NSObject

+ (instancetype)sharedManager;

- (NSString *)imageForButtonNumber:(int)buttonNumber;
- (void)changeImageForButtonNumber:(int)buttonNumber;

@end

的.m

@implementation LightManager {
    NSMutableArray *buttonStates;
    NSArray *images;
}

+ (instancetype)sharedManager {
    static LightManager *sharedManager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[LightManager alloc] init];
    });

    return sharedManager;
}

- (id)init {
    self = [super init];
    if (self) {
        images = @[@"red_light", @"yellow_light", @"green_light"]; // Or whatever images have names in your app
        buttonStates = [[NSMutableArray alloc] initWithCapacity:9000]; // Number of all buttons
        for (int index = 0; index < 9000; index++) {
            [buttonStates addObject:@(LightStateRed)]; // Initalize with default value
        }
    }
    return self;
}

- (NSString *)imageForButtonNumber:(int)buttonNumber { // For restoring previous state
    return images[[buttonStates[buttonNumber] integerValue]];
}

- (void)changeImageForButtonNumber:(int)buttonNumber { // On button click
    if ([buttonStates[buttonNumber] integerValue] == LightStateGreen) { // If you want looping
        buttonStates[buttonNumber] = @(LightStateRed);
    }
    else {
        buttonStates[buttonNumber] = @([buttonStates[buttonNumber] integerValue] + 1);
    }
}

@end

或者从第一个控制器创建管理器,并通过-initWithParams:将状态传递给模态控制器,并通过委托方法或其他方式保存在第一个控制器中。