2011-07-10 177 views
1

我現在有2個視圖控制器,它都有桌面視圖。 當我選擇一個行的第二個實現代碼如下(使用didSelectRowAtIndexPath方法),如何在2個視圖控制器之間傳遞變量

,我想通過我試圖用委託&協議我在第二視圖到了第一個視圖中的信息, ,但不要知道爲什麼,它沒有工作。

我嘗試在第一類中使用class方法,當我在第二個視圖中變量時,調用第一個類中的類方法。變量順利通過先查看,

但是當我想設置LABLE的文本,它還是沒有..

有人可以教教我該怎麼辦?謝謝!


我的協議&委託。

這是第二個視圖。

@protocol CategoriesViewControllerDelegate; 
@interface CategoriesViewController : UIViewController { 
    TableViewNewAppDelegate *appDelegate; 
    id <CategoriesViewControllerDelegate> delegate; 

} 
@property (nonatomic, assign) id <CategoriesViewControllerDelegate> delegate; 
@end 

@protocol CategoriesViewControllerDelegate <NSObject> 

-(void)backstring:(NSString *)String; 

@end 

在.m文件,合成它

@implementation CategoriesViewController 
@synthesize delegate; 

didSelectRowAtIndexPath方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    CategoryData *CateObj = [appDelegate.CateArray objectAtIndex:indexPath.row]; 
    NSString *Strings = [NSString stringWithString:CateObj.CateTitle]; 
    [delegate backstring:Strings]; 

    [self.parentViewController dismissModalViewControllerAnimated:YES]; 

} 

在第一視圖控制器h文件。

#import "CategoriesViewController.h" 
@interface DataController : UIViewController <CategoriesViewControllerDelegate>{ 

.m文件

-(void)backstring:(NSString *)String { 
    NSLog(@"%@",String); 
    jCateField.text = String; 
} 

這是我做我的協議+委託。有什麼問題嗎?

btw,我在第一個視圖控制器中創建了一個Class方法,並在第二個視圖控制器中使用了Class方法,它成功地將變量傳遞給第一個視圖控制器。

但問題是,我無法在我的Class方法中設置Label的文本,甚至不需要調用Instance方法來設置文本。有什麼辦法可以解決這個問題嗎?

+0

向我們展示您的__delegate&protocol__嘗試......它可能是正確的方式 – 2011-07-10 09:41:07

+0

好的..請等我 – Johnny

+0

您好,完成了!你現在可以看到它 – Johnny

回答

1

您提供的代碼似乎是正確的。在你的情況,你必須設置:

@property (nonatomic, assign) id <CategoriesViewControllerDelegate> delegate; 

正確指向它符合您定義的協議的第一個視圖控制器:

#import "CategoriesViewController.h" 
@interface DataController : UIViewController <CategoriesViewControllerDelegate>{ 

如此看來,你推了CategoriesViewController到第一DataController,你可能錯過了之前這樣做。

// self is the first view controller 
// [myCategoriesViewController setDelegate:self]; old fashion 
myCategoriesViewController.delegate = self; 
[self presentModalViewController:myCategoriesViewController animated:YES]; 

這可能可以解決您的問題。希望這可以幫助。 另外考慮讓第一個控制器解僱第二個。 Here是Apple文檔的鏈接。

+0

This Works!我沒有設置代表!謝謝!!!!!! – Johnny

+0

但是爲什麼:/你能解釋一下嗎?對不起,我的英文不太好..蘋果的文檔對我來說太難了.. – Johnny

+0

我建議你閱讀@Daniel R Hicks的答案。你只需要兩個對象,你需要他們溝通。 'delegate'屬性也可以被命名爲'mySweetDelegate',並且是第一個VC指向的引用。沒問題,那麼只要你正確地設置它,發送消息給**委託**。 – 2011-07-10 13:08:30

1

您可以直接將信息傳遞給第二個視圖控制器;

SecondViewController.h

@interface SecondViewController 
{ 
    Information *info; 
} 

@property (nonatomic, retain) Information *info; 

@end 

SecondViewController.m

@implementation SecondViewController 

@synthesize info; 
... 

@end 

並在您的didSelectRowAtIndexPath方法的方法;

SecondViewController *controller = [[SecondViewController alloc] initWithNibNamed:@"SecondViewController" bundle:nil]; 
[controller setInfo:YOUR_INFO_OBJECT]; 

[self.navigationController pushViewController:controller animated:YES]; 
[controller release]; 
+0

我試過這個..但它仍然沒有工作.. – Johnny

+0

你好,我傳遞變量從第二個視圖控制器第一視圖控制器。但我的第一個視圖控制器沒有XIB文件。 – Johnny

0

在第一個視圖控制器實現文件中導入第二個視圖控制器頭文件。在第二視圖控制器頭文件中導入第一個視圖控制器頭文件。 在第一個視圖控制器中創建屬性(text/label/whatever)。 在第二個視圖控制器中創建第一個視圖控制器的屬性。 創建第二個視圖控制器實例,將第一個視圖控制器屬性設置爲您需要的值,將控制器推送到導航控制器。在第二個視圖控制器中更改第一個視圖控制器中的任何內容。實例方法允許。不要忘記釋放第一個視圖控制器。

委託模式也以這種方式工作。

+0

如何「在第二個視圖控制器中創建第一個視圖控制器的屬性」? – Johnny

+0

@約翰尼#導入 「RootViewController.h」 @interface SecondViewController:的UIViewController { } @屬性(非原子,保留)RootViewController的* RVC; @end –

0

視圖控制器是對象。對象可以具有可以從其他對象調用的方法,並且它們可以具有實例變量。 (「代表」只是一個很好的術語。)

只要調用者具有被調用者的地址,爲什麼在你的視圖控制器之間傳遞數據應該是困難或複雜的沒有內在原因。 (並且給定的VC是否具有XIB是無關緊要的。)

聽起來好像你真正的問題是不知道如何處理數據,一旦它傳遞給被調用者。

愚蠢的問題:「jCateField」實際連接到您想要更改的標籤,還是零?如果您從代碼創建標籤(因爲您沒有XIB),則需要在創建視圖期間將創建的標籤地址存儲到「jCateField」中。

+0

jCateField是一個UILabel,我使用addSubView添加在我的tableView的單元格...它不是零。是的,我的問題就是你說的,一旦數據傳遞給被調用者,不知道如何處理數據。 – Johnny

+0

您確定您在屏幕上看到的標籤是與jCateField相對應的標籤嗎? (嘗試改變,例如,backgroundColor,看看你是否有正確的。)在更改文本後,你是否在做任何事情來刷新視圖(例如,setNeedsDisplay)? –

0

您可以發佈代碼,以確保當您回到第一個視圖控制器時顯示內容。如果日誌爲您提供適當的值,則問題出在連接上(如果通過iboutlet進行)或與addsubview。 你有沒有標籤或沒有價值(標籤被隱藏)。

相關問題