簡體   English   中英

將Double傳遞給Viewcontroller,然后傳遞給UIView

[英]Pass double to Viewcontroller then to 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的完整代碼,希望您能看到我要去哪里。 或向我解釋我做錯了什么。

在不了解您代碼的全部流程的情況下,並且基於事實,我發現設置程序沒有問題(除非您在其他地方修改了數據)。 我懷疑問題是您正在嘗試在傳入雙精度值之前調用它們,但是我不確定。

當您創建需要值的自定義內容時,最好的做法是使用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)調用[<customView> setNeedsDisplay]或調用[view addSubview: <customView>]時,將調用drawRect: [view addSubview: <customView>] 我也沒有在您的代碼中使用過它,所以我不確定您在哪里或如何進行這些操作。 但是在自定義init之外執行此操作的任何一種方法都是不好的做法。

如果這不起作用,請編輯您的答案以包含有關在何處以及如何創建此視圖或將其添加到屏幕的完整代碼。

編輯

好的,基本上您的代碼沒有執行任何操作。

1。 在您的viewDidLoad您正在調用此代碼:

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

您不使用myView或對其執行任何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在其他語言。 你正試圖在這里做的是設置thicknessValue2draw2D財產thicknessValue2 (第二個是個體經營)。 您將忽略方法thicknesscapWidth提供的變量。 我不知道這段代碼中地獄的thicknessValue2 (沒有self)是什么,但是基本上在這里,您是從代碼中接收值的,其中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傳遞給CGRectmyView意味着您的視圖沒有大小或位置,並且在drawRect內部,您沒有使用提供的rect(應該為0,因為您沒有給出一個),因此我有不知道您如何認為圖形在視圖中?

如果您不了解某些更簡單的概念,那么我不確定為什么您會走上使用圖形上下文創建自定義UIView的非常復雜的路線。 這不是一個簡單的例子,在PHP中,您只需要“包含文件”即可。 您會忽略創建UIViewsUIImageViews的簡單方面,而沿着手工繪制自定義UI元素的高級方法走了……當然,它不像包含文件那么簡單,您生氣了嗎?

我不希望這以錯誤的方式提出來,但我沒有時間幫助您解決對目標c的這種不熟悉。 我不認為您基於創建實例和使用實例方法的方式正確地理解了面向對象的代碼,除了語法不同的方法,指向實例的指針的方法以外,這里還沒有目標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");
}

我要添加另一個答案,因為先前的答案已經太長了。

杜德(Dude)我在身體上無能為力,一點也不復雜。 很抱歉,但沒有在線找到有關創建對象的信息,這是不正確的,實際上在任何地方都是如此。 我在哪里學的?

2件事要注意。

  1. 命名約定表示類以大寫draw2d開頭,例如draw2d需要為Draw2d

  2. 您不應該為變量xxx1,xxx2等命名。如果它們是同一事物,則將它們命名為同一事物。 它們是否是不同的類無關緊要。

碼:

在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM