2010-12-16 111 views
0

我是iPhone編程的新手。我試圖從一個視圖控制器發送消息到另一個。這個想法是,viewControllerA從用戶獲取信息並將其發送到viewControllerB。 viewControllerB然後應該顯示在標籤中的信息。在類Obj-C之間發送消息?

viewControllerA.h

#import <UIKit/UIKit.h> 
@interface viewControllerA : UIViewController 
{ 
int num; 
} 
-(IBAction)do; 
@end 

viewControllerA.m

#import "viewControllerA.h" 
#import "viewControllerB.h" 

@implementation viewControllerA 

- (IBAction)do { 
//initializing int for example 
num = 2; 
viewControllerB *viewB = [[viewControllerB alloc] init]; 
[viewB display:num]; 
[viewB release]; 
//viewA is presented as a ModalViewController, so it dismisses itself to return to the 
//original view, i know it is not efficient but it is not the problem with my code 
[self dismissModalViewControllerAnimated:YES]; 
} 

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

@end 

viewControllerB.h

#import <UIKit/UIKit.h> 
@interface viewControllerB : UIViewController 
{ 
IBOutlet UILabel *label; 
} 
- (void)display:(int)myNum; 

@end 

viewControllerB.m

#import "viewControllerB.h" 
#import "viewControllerA.h" 

@implementation viewControllerB 

- (void)display:(int)myNum { 
NSLog(@"YES"); 
[label setText:[NSString stringWithFormat:@"%d", myNum]]; 
} 

@end 

YES已成功記錄,但標籤的文本不會更改。可以發送消息不是 訪問實例變量什麼的?

謝謝。

+0

如果您沒有正確連接IBOutlet,則無論您在代碼中做什麼,都不會看到任何內容,因此請確保這些內容正確無誤。 – jakev 2010-12-16 07:18:41

+0

檢查答案,如果你的問題已經解決,然後接受一個答案。 – Ishu 2010-12-16 08:10:47

回答

1

用NSInteger替換所有int將解決您的問題。

編輯:

好的,如果你有正確的連接。

實際上會發生什麼情況,您從viewA調用show函數並嘗試從這裏將文本寫入viewB的標籤之前,然後加載該頁面dats爲什麼您面臨problem.so要解決此問題,則需要將值發送到viewB並使用viewDidLoad方法將文本寫在標籤上。這將解決您的問題。

+0

什麼都不解決。 – jbrennan 2010-12-16 06:59:45

+0

@ jbrennan,我已經做到了這一點,這個問題解決了上述的解決方案。你試過這個如果不是那麼爲什麼-1。 – Ishu 2010-12-16 07:02:45

+0

@Ishu,我同意假設他的班級,IBoutlets等設置正確。這不是C++,使用NSInteger – jakev 2010-12-16 07:10:51

1

以您嘗試的方式發送消息沒有任何問題。錯誤在於使用'int'作爲類型。在Objective-C中使用NSInteger來減輕許多頭痛。

+1

對於iOS目標,'NSInteger'是一個int類型定義。所以當代碼被預處理時,NSInteger就變成了int。所以目前它不能解決iOS目標的任何問題。雖然這是一個好主意,但如果Apple改變了NSInteger的類型,你的代碼將自動獲得好處。但在這種情況下,它什麼都不做。 – jbrennan 2010-12-16 07:19:26

+0

好的,點了。這是我在代碼中看到的唯一弱點,但我認爲理所當然的是,有他的網點安全。 – jakev 2010-12-16 07:28:58

0

你能澄清你在這裏做什麼,以及這些視圖控制器如何與屏幕上顯示的內容相關聯嗎?我的理解是,viewControllerA是作爲某種收集信息的模態對話框呈現的?它由viewControllerB提供,當A關閉時,B在屏幕上設置其標籤以反映從A返回的值。

如果是這種情況,由於某些原因,您需要在A中引用B。首先,您在A的do函數中初始化B的一個實例並告訴它顯示您的號碼,但我沒有看到您將B放置在任何地方。 - 第二,在A上調用dismissModalViewControllerAnimated:不會解除A,它將關閉A呈現的模式視圖控制器。所以要解僱A,你需要在B上說[self dismissModalViewControllerAnimated:YES];。最好通過讓A通知B它已準備好關閉。

1

看起來好像你的label沒有指向任何東西(所以當你告訴它setText:時,該消息只是發送到nil,因此沒有任何反應)。

檢查界面生成器以確保您已將出口設置爲實際指向視圖中的標籤。

+0

@Ishu,你是原始的海報....? – jakev 2010-12-16 07:13:22

+0

@JakeVA,不,但我在這段時間之前面對這個問題。 – Ishu 2010-12-16 07:15:01

+0

我的情況的第一個評論,我認爲這個海報因爲問題實際上是int而不是連接。好的,我根據真正的想法改變它。 – Ishu 2010-12-16 07:17:05

1

有沒有比你在這裏顯示的更多的代碼?我沒有看到viewB是如何顯示的 - 沒有[self.view addSubview:viewB.view]或任何表示它將顯示在視圖中的東西。也許這就是問題所在?

相關問題