2013-03-24 110 views
4

我是新來的開發,一直在撞牆我試圖弄清楚,我敢肯定,我錯過了一些愚蠢的東西,但嘗試了各種不同的解決方案後,我我仍然無法得到我期待的結果。iOS更新ViewController從另一個類的UILabel

我想能夠從另一個類更新ViewController中的UILabel,這裏是一個我不能工作的小演示程序,我有ViewController有兩個UILabels,一個是從viewDidDoad更新的另一個我想從另一個名爲NewClass的類中更新,這個類名爲ViewController,我可以看到該類正在被正確調用,因爲控制檯正在記錄NSLog條目,但我無法獲取更新UILabel的語法。

在此先感謝。

ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController { 

    UILabel *_labelupdate01; 
    UILabel *_labelupdate02;  
} 

@property (nonatomic, retain) IBOutlet UILabel *labelupdate01; 
@property (nonatomic, retain) IBOutlet UILabel *labelupdate02; 

@end 

ViewController.m

#import "ViewController.h" 
#import "NewClass.h" 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize labelupdate01; 
@synthesize labelupdate02; 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    labelupdate01.text = @"Update from ViewController"; 

    [NewClass updatedisplay]; 
} 
@end 

NewClass.h

#import <Foundation/Foundation.h> 

@class ViewController; 

@interface NewClass : NSObject 

@property (nonatomic, assign) ViewController *ViewController; 

+ (void)updatedisplay; 

@end 

NewClass.m

#import "NewClass.h" 
#import "ViewController.h" 

@implementation NewClass 

@synthesize ViewController = _ViewController; 

+ (void)updatedisplay 
{ 
    NSLog(@"NewClass - updatedisplay"); 
    ViewController *labelupdate02; 
    labelupdate02.labelupdate02.text = @"Update from NewClass"; 
} 

@end 

回答

4

中的NewClass定義這個像

+ (void)updatedisplay:(ViewController *)vc 
{ 
    [email protected]"Update from NewClass"; 

} 

,並從您的viewController

[NewClass updatedisplay:self]; 
+0

非常感謝,這也正是我想要的。 – Wez 2013-03-24 23:04:36

1

首先,確保你在NewClass初始化ViewController,那麼你可以做任何你想做的事情。

#import <Foundation/Foundation.h> 

@class ViewController; 

@interface NewClass : NSObject 

@property (nonatomic, assign) ViewController *aViewController; 

+ (void)updatedisplay; 

@end 

在實施

#import "NewClass.h" 
#import "ViewController.h" 

@implementation NewClass 

+ (void)updatedisplay 
{ 

_aViewController.labelupdate02.text = @"Update from NewClass"; 

} 

@end 
+0

此方法沒有爲我工作,我得到一個「未知類型名稱aViewController」錯誤,我已更新@property語句以包括aViewController但它仍然錯誤。 – Wez 2013-03-24 23:14:40

+0

對不起,你應該使用'_aViewController' – David 2013-03-24 23:24:53

0
@property (nonatomic, retain) IBOutlet UILabel *labelupdate01; 
@property (nonatomic, retain) IBOutlet UILabel *labelupdate02; 

@property (nonatomic, assign) ViewController *aViewController; 
叫它

那麼,從改變這些屬性開始(非原子,弱)。這是更正確的方法。從MVC模式中的一個模型類更新顯示是不好的做法。所以你在+ (void)updatedisplay中的邏輯對我來說沒有意義,我認爲它應該是類似+(NSString *) getStringToDisplay的功能,其功能暗示在func中。名稱和標籤的文本根據收到的字符串在vc代碼中更新。

但爲了回答你問的方式你的問題:

正確的方法是做它作爲甲基建議或初始化期間傳遞視圖 - 控制你的NewClass實例,以便您的特定視圖控制器已初始化。

與大多數對象你不這樣做獲得當前活動視圖 - 控制:

ViewController *labelupdate02; 
labelupdate02.labelupdate02.text = @"Update from NewClass"; 

labelupdate02未初始化這裏。但即使你分配並初始化之後,你也不會得到你想更新其視圖的活動viewcontroller,而只是另一個viewcontroller實例。

+0

感謝您提供的信息,我已經將它們改變爲弱點,並且根據以下來自Meth的建議,現在它正在工作。 – Wez 2013-03-24 23:07:38

相關問題