如何根据在 Objective C 中使用它的视图控制器在同一个 class 中使用不同的数据?
How do I use different data in the same class based on the View Controller that uses it in Objective C?
我有一个名为 GaugeView 的 class,它允许我构建一个“仪表”,在其中显示一条根据当前分数 (CURRENT_POINTS) 之间的比率着色的线条和最高分 (MAX_POINTS)。
这个class,目前只在应用程序的一个部分使用,两个变量保存在UserDefaults中。
现在我希望此 class 用于应用程序的其他部分,并且我想根据使用此 class 而不是 [的 ViewController 使用不同的数据=30=] 和 CURRENT_POINTS.
我该怎么做?
我试图复制 class 但 Xcode 给了我一个编译时错误,更准确地说是“error 4 duplicate symbols for architecture arm64”。
想到介入这部分代码:
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
double maxPoints = [[NSUserDefaults standardUserDefaults] integerForKey:MAX_POINTS];
double currentPoints = [[NSUserDefaults standardUserDefaults] integerForKey:CURRENT_POINTS];
orangeSegmentValue = (currentPoints/maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
放一个“如果”,但我不知道如何设置它。这是我的想法:
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
if (Im_in_ViewController_A) {
//use data from View Controller A
} else {
//do this
double maxPoints = [[NSUserDefaults standardUserDefaults] integerForKey:MAX_POINTS];
double currentPoints = [[NSUserDefaults standardUserDefaults] integerForKey:CURRENT_POINTS];
}
orangeSegmentValue = (currentPoints/maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
有什么帮助吗?
谢谢
您可以使用协议在 class 中使用默认实现获取 2 个值:
@protocole GaugeViewDelegate {
@required
- (double) currentPoints();
- (double) maxPoints();
@end
@interface GaugeView : UIView, GaugeViewDelegate
@property GaugeViewDelegate delegate;
…
@implementation GaugeView
- (id) init() {
…
_delegate = self;
..,
}
- (double) currentPoints() {
// get value from user default
return [[NSUserDefaults standardUserDefaults] integerForKey:CURRENT_POINTS] * 1.0;
}
- (double) maxPoints() {
return [[NSUserDefaults standardUserDefaults] integerForKey:MAX_POINTS];
}
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
double maxPoints = [delegate maxPoints];
double currentPoints = [delegate currentPoints];
orangeSegmentValue = (currentPoints/maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
…
然后将其他视图控制器声明为实现协议并添加 2 个可以是属性的方法:
@interface oneViewVontroller : UIViewCintriller, GaugeViewDelagate
@property double maxPoints;
@property double currentPoints;
…
@implementation oneViewVontroller
- (void) viewDidLoad() {
…
_maxPoints = 1000.0
_currentPoints = 0.0;
…
}
您也可以只实现这 2 个方法。
按照建议尝试了不同的解决方案后,我简单地在 GaugeView.h
中声明了 2 个属性
@property double maxPoints;
@property double currentPoints;
并将它们用于方法
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
orangeSegmentValue = (_currentPoints/_maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
并且无需将它们保存到 NSUserDefaults 中,因此我可以在需要时将它们赋值到使用 GaugeView 的 类 中。
我有一个名为 GaugeView 的 class,它允许我构建一个“仪表”,在其中显示一条根据当前分数 (CURRENT_POINTS) 之间的比率着色的线条和最高分 (MAX_POINTS)。
现在我希望此 class 用于应用程序的其他部分,并且我想根据使用此 class 而不是 [的 ViewController 使用不同的数据=30=] 和 CURRENT_POINTS.
我该怎么做? 我试图复制 class 但 Xcode 给了我一个编译时错误,更准确地说是“error 4 duplicate symbols for architecture arm64”。
想到介入这部分代码:
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
double maxPoints = [[NSUserDefaults standardUserDefaults] integerForKey:MAX_POINTS];
double currentPoints = [[NSUserDefaults standardUserDefaults] integerForKey:CURRENT_POINTS];
orangeSegmentValue = (currentPoints/maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
放一个“如果”,但我不知道如何设置它。这是我的想法:
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
if (Im_in_ViewController_A) {
//use data from View Controller A
} else {
//do this
double maxPoints = [[NSUserDefaults standardUserDefaults] integerForKey:MAX_POINTS];
double currentPoints = [[NSUserDefaults standardUserDefaults] integerForKey:CURRENT_POINTS];
}
orangeSegmentValue = (currentPoints/maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
有什么帮助吗? 谢谢
您可以使用协议在 class 中使用默认实现获取 2 个值:
@protocole GaugeViewDelegate {
@required
- (double) currentPoints();
- (double) maxPoints();
@end
@interface GaugeView : UIView, GaugeViewDelegate
@property GaugeViewDelegate delegate;
…
@implementation GaugeView
- (id) init() {
…
_delegate = self;
..,
}
- (double) currentPoints() {
// get value from user default
return [[NSUserDefaults standardUserDefaults] integerForKey:CURRENT_POINTS] * 1.0;
}
- (double) maxPoints() {
return [[NSUserDefaults standardUserDefaults] integerForKey:MAX_POINTS];
}
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
double maxPoints = [delegate maxPoints];
double currentPoints = [delegate currentPoints];
orangeSegmentValue = (currentPoints/maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
…
然后将其他视图控制器声明为实现协议并添加 2 个可以是属性的方法:
@interface oneViewVontroller : UIViewCintriller, GaugeViewDelagate
@property double maxPoints;
@property double currentPoints;
…
@implementation oneViewVontroller
- (void) viewDidLoad() {
…
_maxPoints = 1000.0
_currentPoints = 0.0;
…
}
您也可以只实现这 2 个方法。
按照建议尝试了不同的解决方案后,我简单地在 GaugeView.h
中声明了 2 个属性@property double maxPoints;
@property double currentPoints;
并将它们用于方法
- (void) drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
if(ctx == nil) return;
orangeSegmentValue = (_currentPoints/_maxPoints)*270.00;
[self drawBackground:rect context:ctx];
}
并且无需将它们保存到 NSUserDefaults 中,因此我可以在需要时将它们赋值到使用 GaugeView 的 类 中。