2015-09-15 176 views
0

我在ViewController中有一個方法來繪製一個按鈕。在ViewController2中我想調用方法並繪製按鈕。從一個類中調用一個方法並在另一個類中使用

在ViewController.h

@interface ViewController : UIViewController 

-(void)method; 
@end 

ViewController.m

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

-(void)method{ 
    UIButton*Touch1= [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [Touch1 addTarget:self action:@selector(TouchButton1:) forControlEvents:UIControlEventTouchUpInside]; 
    [Touch1 setFrame:CGRectMake(50,50, 100, 100)]; 
    Touch1.translatesAutoresizingMaskIntoConstraints = YES; 
    [Touch1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal]; 
    [Touch1 setExclusiveTouch:YES]; 
    [self.view addSubview:Touch1]; 

    NSLog(@"hi "); 
} 

-(void)TouchButton1:(UIButton*)sender{ 

    NSLog(@"hi again"); 

} 

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

@end 

然後我試圖從ViewController2

調用
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    ViewController * ViewCon = [[ViewController alloc]init]; 
    [ViewCon method]; 
} 

的的NSLog顯示正確的文本,但沒有按鈕創建。 我的問題是什麼?

由於

+0

PLZ添加的全部細節,所以我可以幫你 –

回答

1

我認爲這個問題是由方法「方法」上的「自我」的範圍引起的。您的按鈕已添加到firstView中,而不是添加到secondView中。要做你想做的事,你必須通過你想添加按鈕的範圍。就像@trojanfoe提供的示例一樣。

-(void)method:(UIView *)_view { 
    UIButton*Touch1= [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [Touch1 addTarget:self action:@selector(TouchButton1:) forControlEvents:UIControlEventTouchUpInside]; 
    [Touch1 setFrame:CGRectMake(50,50, 100, 100)]; 
    Touch1.translatesAutoresizingMaskIntoConstraints = YES; 
    [Touch1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal]; 
    [Touch1 setExclusiveTouch:YES]; 
    [_view addSubview:Touch1]; 

    NSLog(@"hi "); 
} 

而進入你的第二個觀點,你可以撥打:

ViewController * ViewCon = [[ViewController alloc]init]; 
[ViewCon method:self.view]; 

我認爲是這個問題,我希望這將幫助你

+1

這這是一個糟糕的模式,因爲它效率低下,不方便。 – trojanfoe

+0

創建一個具有您的功能的類,更具可重用性。如果您的代碼的另一部分使用相同的邏輯來實現該按鈕,則可以使用「utils」類而不使用可複製的代碼。但是如果你的問題是一個特定的問題,那麼你的整個代碼只能使用一次,做一個分離的類是解決一個簡單問題的更復雜的方法。但是像@trojanfoe這樣的類別在他們的答案的最後部分說是一個聰明的解決方案。 – Ostanik

1

創建一個單獨的類(稱爲Utils,例如)與一個類的方法,可以從兩個視圖控制器可以稱爲:

@implementation Utils 

+(void)methodForView:(UIView *)view 
{ 
    UIButton*Touch1= [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [Touch1 addTarget:self action:@selector(TouchButton1:) forControlEvents:UIControlEventTouchUpInside]; 
    [Touch1 setFrame:CGRectMake(50,50, 100, 100)]; 
    Touch1.translatesAutoresizingMaskIntoConstraints = YES; 
    [Touch1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal]; 
    [Touch1 setExclusiveTouch:YES]; 
    [view addSubview:Touch1]; 
} 

@end 

並調用它是這樣的:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [Utils methodForView:self.view]; 
} 

或者更好的是,在UIViewController -subclass中實現該方法,然後從該基類派生所有其他視圖控制器。