我有三个场景(viewControllers)通过模态segues链接(我不想要导航控制器)。视图有一系列按钮,每个按钮最初都带有红灯图像。单击时,它们将转到下一个场景,其动作可能会影响前一场景中的图像,使其成为黄色或绿色光图像。
如果通过setImage以编程方式更改按钮图像,则稍后再次单击该按钮时,按钮图像将始终恢复为初始红光图像。同样,如果我更改场景2上的按钮图像,返回场景1,然后再返回场景2,按钮将恢复为默认值,而不是保留上一个按钮图像状态。
所以,两个基本问题是:
谢谢, 射线
答案 0 :(得分:1)
如果您正在使用模态转换,则需要使用dismissViewControllerAnimated:completion:
来取回。我猜这是你从VC1推送到VC2,然后推送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:
将状态传递给模态控制器,并通过委托方法或其他方式保存在第一个控制器中。