0

我有一个UIView, UILabel, 并UISlider放在UIVeiwController我的ViewController文件中。我还以编程方式添加了一个UILabel作为UIView调试工具。

是的,我可以连接到与另一个相同的UILabel内部,但是一旦我解决了这个问题,我将在图形计算中传递这个值。我愿意接受将这个变量传递给我的任何建议,但更愿意避免创建全局变量。我将我的值传递给我应该放置的值,但是当我尝试通过“引用”我的实现文件中的滑块值来发送值时,它永远不会成功,我得到的值为零。UIViewUILabelUIViewUISliderUILabelUIVeiwControllerGraphView.m

我花了两天时间搜索 stackoverflow 论坛、查看文档和重新阅读书籍,试图找出我的问题,虽然我学到了很多东西(并解决了其他问题),但我仍然没有弄清楚这一点。我敢肯定它是如此简单,我肯定会踢自己。我欢迎您参考其他文档(我可能已经阅读过),但也请提供一些建设性的反馈和指导。我的代码如下:

视图控制器.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    NSString *viewControllerSliderValue;
}
- (NSString *) viewConrtollerSliderValue;

@property (weak, nonatomic) IBOutlet UILabel *sliderValueLabel;

@property (weak, nonatomic) IBOutlet UISlider *sliderValue;

- (IBAction)sliderChange:(UISlider *)sender;

@end

视图控制器.m

#import "ViewController.h"
#import "GraphView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    float sliderVal = self.sliderValue.value;
    self.sliderValueLabel.text = [NSString stringWithFormat:@"%.1f",sliderVal];
    NSLog(@"viewDidLoad: sliderVal = %f", sliderVal);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)sliderChange:(UISlider *)sender
{
    float sliderVal = sender.value;
    self.sliderValueLabel.text = [NSString stringWithFormat:@"%.1f", sliderVal];
    NSLog(@"sliderChange: sliderVal = %f", sliderVal);

}

- (NSString *)viewConrtollerSliderValue
{
    float sliderVal = self.sliderValue.value;
    viewControllerSliderValue = [NSString stringWithFormat:@"%f",[self sliderValue].value];
    NSLog(@"sliderChange: sliderVal = %f", sliderVal);
    return viewControllerSliderValue;
}

@end

图形视图.h

#import <UIKit/UIKit.h>

@interface GraphView : UIView

@end

图形视图.m

#import "GraphView.h"
#import "ViewController.h"

@implementation GraphView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    ViewController *viewController = [[ViewController alloc] init];

    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 90, 140, 20)];
    NSLog(@"GraphView: drawRect: vierContrllerSliderValue = %@", [viewController viewConrtollerSliderValue]);
    myLabel.text = [viewController viewConrtollerSliderValue];
    myLabel.backgroundColor = [UIColor lightGrayColor];
    myLabel.textAlignment = NSTextAlignmentCenter;
    [self addSubview:myLabel];
}

@end
4

2 回答 2

1

问题是您GraphView在调用时正在创建一个新的视图控制器,它ViewController *viewController = [[ViewController alloc] init];与屏幕上显示的视图控制器是分开的。新控制器的滑块不是您要操纵的滑块,因此它永远不会改变值。

另一个问题是您GraphView每次调用时都会添加一个新标签drawRect:。每次需要重新绘制视图时都会调用该方法。相反,将标签添加为-initWithFrame:方法中的子视图,并将对它的引用保留为实例变量或属性。

GraphView完全不知道视图控制器会更好。相反,GraphView应该有一个 setter 方法来设置应该显示的值。控制器应负责在滑块更改时告诉图形视图进行更新。它看起来像这样:

@interface GraphView
@property (nonatomic) float graphValue;
@end

@implementation GraphView {
    UILabel *graphLabel;
}


- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        graphLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 90, 140, 20)];
        graphLabel.backgroundColor = [UIColor lightGrayColor];
        graphLabel.textAlignment = NSTextAlignmentCenter;
        [self addSubview:graphLabel];
    }
    return self;
}


- (void)setGraphValue:(float)theValue {
    _graphValue = theValue;
    graphLabel.text = [NSString stringWithFormat:@"%f", theValue]
}

// Note; no need for -drawRect, because it will all be drawn by the label, which is a subview.

@end
于 2013-05-21T04:49:12.603 回答
0

我在您的代码中注意到了一些事情:

  • drawRect:方法中的所有内容都不应在drawRect:. drawRect:只能用于屏幕上绘制像素(使用贝塞尔路径、颜色等)。drawRect:每秒可以调用很多次,因此尽可能快很重要。因此,永远不应该创建对象和操作视图层次结构。drawRect:永远不要在 a 中创建 ViewControllers 。

如果您需要设置视图的初始状态,则应在视图控制器的viewDidLoad方法中完成。您可能希望在 xib 中创建 GraphView 并创建与视图控制器的出口连接。您可以通过向您的 xib 添加一个新的 UIView 并在右侧边栏中的身份检查器中编辑类来执行此操作,如下所示。(您也可以使用编程方式创建 GraphViewinitWithFrame:并将其添加为视图控制器视图的子视图)

在此处输入图像描述

于 2013-05-21T04:54:50.380 回答