2011-07-10 252 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。 你有没有标签或没有价值(标签被隐藏)。

相关问题