将double传递给Viewcontroller然后传递给UIView

时间:2014-04-14 09:51:03

标签: ios objective-c uiview

完整代码

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewControllerImage : UIViewController {
    IBOutlet UILabel *datum;
    IBOutlet UILabel *debug;
}

@property (nonatomic, assign) double thicknessValue1;
@property (nonatomic, assign) double capWidthValue1;
@end

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [datum setTransform:CGAffineTransformMakeRotation(M_PI / 2)];

    NSString *value =  [[NSString alloc] initWithFormat:@"%f", self.thicknessValue1];

    debug.text = value;

    draw2D *myView = [[draw2D alloc]initWithThickness: self.thicknessValue1 andCapWidth: self.capWidthValue1];

    NSLog(@"First Logs");
    NSLog(@"%f",myView.thicknessValue2);
    NSLog(@"%f",myView.capWidthValue2);
    NSLog(@"END FIRST LOGS");
}

draw2D.h     #import

@interface draw2D : UIView 

- (id)initWithThickness:(double)thickness andCapWidth:(double)capWith;


@property (nonatomic, assign) double thicknessValue2;
@property (nonatomic, assign) double capWidthValue2;

@end

draw2D.m

#import <UIKit/UIKit.h>

@interface draw2D : UIView 

- (id)initWithThickness:(double)thickness andCapWidth:(double)capWith
{
    self = [super init];
    if(self)
    {
        thicknessValue2 = self.thicknessValue2;
        capWidthValue2 = self.capWidthValue2;
        NSLog(@"Second Logs");
        NSLog(@"%f",thicknessValue2);
        NSLog(@"%f",capWidthValue2);
        NSLog(@"END Second LOGS");
    }
    return self;
}



@end

我已经为您提供了第二个视图控制器以及UIView的完整代码,我希望您能看到我出错的地方。或者向我解释我做错了什么。

2 个答案:

答案 0 :(得分:1)

在不知道代码的完整流程的情况下,根据事实,我发现您的setter没有问题(除非您在其他地方修改数据)。我怀疑问题是你在传入之前试图调用双值,但我不能确定。

当您创建需要值的自定义内容时,最好使用init方法传入这些内容,以便在自定义代码中获得所需的所有值,这样您就不会忘记任何内容每次创建一个。

因此,您需要创建自己的init方法,例如:

- (id)initWithThickness:(double)thickness andCapWidth:(double)capWith
{
    self = [super init];
    if(self)
    {
        self.thickness = thickness;
        self.capWidth = capWidth;
    }
    return self;
}

然后打电话给你这样的代码:

draw2D *myView = [[draw2D alloc]initWithThickness: self.thicknessValue1 andCapWidth: self.capWidthValue1];

回复:我的其他评论。当您(或iOS)拨打drawRect:或致电[<customView> setNeedsDisplay]时,系统会调用[view addSubview: <customView>]。我还没有看到在你的代码中使用过的,所以我不确定你在做什么,或者你是怎么做的。但无论哪种方式在自定义init之外执行此操作都是不好的做法。

如果这不起作用,请编辑您的答案,以包含有关创建/添加此视图的位置和方式的完整代码。

修改

好吧,基本上你的代码什么也没做。

1。在您的viewDidLoad中,您称之为:

draw2D *myView = [[draw2D alloc]initWithThickness: self.thicknessValue1 andCapWidth: self.capWidthValue1];

你没有对myView使用或做任何事情,这是指向draw2D实例的指针,当到达viewDidload中的下一个花括号时,这将消失而不做什么,因为它没有在任何地方使这不是从PHP到Objective-c问题的过渡。这是面向对象的基本编程。一旦它超出范围就消失了。与int相同,如果你在这里创建一个int并尝试在viewDidAppear中调用它你不能因为它超出范围,为什么UI有任何不同,你没有要求将它绘制到屏幕上,所以它就消失了。

2。您的自定义init方法毫无意义。

- (id)initWithThickness:(double)thickness andCapWidth:(double)capWith
{
    self = [super init];
    if(self)
    {
        thicknessValue2 = self.thicknessValue2;
        capWidthValue2 = self.capWidthValue2;

self是对象实例的引用,与其他语言中的this相同。您要在此处尝试将thicknessValue2设置为draw2D属性thicknessValue2(第二个属于自我)。您忽略方法thicknesscapWidth提供的变量。我不知道这个代码中的地狱thicknessValue2(没有自己)是什么,但基本上你在这里接收的值是init被调用的代码...然后说0 = 0两次。我清楚地告诉你代码self.thickness = thickness = self.<draw2D property name> = <supplied variable from method>。可能在你的情况下等于self.thicknessValue2 = thickness。在这里,您还没有阅读代码或了解方法的工作原理。

3。我不知道您在drawRect

中想要实现的目标

首先,这样做没有意义:

double thickness = thicknessValue2;
double capWidth = capWidthValue2;

为什么不使用thicknessValue2 ???至关重要的是thicknessValue2不应该是self.thicknessValue2 ???

忽略这一点,你无处可去CGRect到你的myView意味着你的视图没有大小或位置,并且在你的drawRect内你没有使用提供的矩形(应该为0,因为你没有给出一个),因此我不知道你认为你的绘图是如何在视图中的?

如果您不理解一些更简单的概念,我不确定为什么要使用图形上下文创建自定义UIView的复杂路径。这不是一个简单的PHP案例,你只需要“包含一个文件”。你忽略了创建UIViewsUIImageViews的简单方面,并沿着绘制自定义UI元素的高级之路......当然它不像包含文件那么简单,你疯了吗? ?

我不希望这种方式出错,但我没有时间用这种对目标c的不熟悉程度来帮助你。我不认为您根据创建实例和使用实例方法的方式正确理解面向对象的代码,除了具有不同语法的方法之外,没有任何具体的客观特定内容,指向实例的指针的想法不是什么新鲜事。我认为你需要阅读一些书籍并阅读一些教程,因为它代表了你的代码几乎没有任何意义,我认为你在尝试最基本的东西之前试图进入更高级的东西。

编辑2:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [datum setTransform:CGAffineTransformMakeRotation(M_PI / 2)];

    NSString *value =  [[NSString alloc] initWithFormat:@"%f", self.thicknessValue1];

    debug.text = value;

    draw2D *myView = [[draw2D alloc]initWithThickness: self.thicknessValue1 andCapWidth: self.capWidthValue1];

    // Now it will not go out of scope, as it will be added to the 
    // viewControllers view property
    [self.view addSubview:myview];

    NSLog(@"First Logs");
    NSLog(@"%f",myView.thicknessValue2);
    NSLog(@"%f",myView.capWidthValue2);
    NSLog(@"END FIRST LOGS");
}

答案 1 :(得分:1)

我正在添加另一个答案,因为前一个已经太长了。

老兄,我身体上做不了什么,这根本不复杂。我很抱歉,但没有在网上找到关于创建一个对象的信息是不正确的,它确实无处不在。我从哪里学到它?

要注意的两件事。

  1. 命名约定说类以一个大写字母开头,例如draw2d需要Draw2d

  2. 您不应该命名变量xxx1,xxx2等。如果它们是相同的,请将它们命名为相同的东西。如果他们是不同的班级并不重要。

  3. <强>代码:

    在viewController中:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        NSLog(@"Before init");
        Draw2d *myView = [[Draw2d alloc] initWithFrame:CGRectMake(0, 0, 320, 320) thickness:15.0 capwidth:17.5];
        NSLog(@"After init");
        [self.view addSubview:myView];
        NSLog(@"After placing on superview at x= 0, y = 0, width = 320, height = 320");
    }
    

    Draw2d.h

    #import <UIKit/UIKit.h>
    
    @interface Draw2d : UIView
    
    @property (nonatomic, assign) double thickness;
    @property (nonatomic, assign) double capWidth;
    
    - (id)initWithFrame:(CGRect)frame thickness:(double)thickness capwidth:(double)capWidth;
    
    @end
    

    Draw2d.m

    #import "Draw2d.h"
    
    @implementation Draw2d
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }
    
    - (id)initWithFrame:(CGRect)frame thickness:(double)thickness capwidth:(double)capWidth
    {
        self = [super initWithFrame:frame];
        if(self)
        {
            // Left side is property in .h
            // right side is the parameters passed into method
            self.thickness = thickness;
            self.capWidth = capWidth;
        }
        return self;
    }
    
    - (void)drawRect:(CGRect)rect
    {
        NSLog(@"Passed in thickness: %f", self.thickness);
        NSLog(@"Passed in capWidth: %f", self.capWidth);
    }
    
    
    @end
    

    控制台:

    2014-04-16 09:23:23.613 Before init
    2014-04-16 09:23:23.613 After init
    2014-04-16 09:23:23.613 After placing on superview at x= 0, y = 0, width = 320, height = 320
    2014-04-16 09:23:23.615 Passed in thickness: 15.000000
    2014-04-16 09:23:23.616 Passed in capWidth: 17.500000