如何根据在 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 的 类 中。