如何在2个视图控制器之间传递变量

时间:2011-07-10 09:36:03

标签: iphone objective-c xcode

我现在有2个视图控制器,它们都有表视图。 当我在第二个tableview中选择一行时(使用didSelectRowAtIndexPath),

我希望将第二个视图中的信息传递给第一个视图, 我试图使用委托和协议,但不知道为什么,它没有用。

我尝试在第一个类中使用类方法,当我在sencond View中获得变量时, 在第一个类中调用类方法。变量成功传递给第一个View,

但是当我想设置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;
}

这就是我的协议+委托的方式。有什么问题吗?

顺便说一句,我在第一个视图控制器中创建了一个Class方法,并在sencond视图控制器中使用Class方法,它成功地将变量传递给第一个视图控制器。

但问题是,我无法在我的Class方法中设置Label的文本,甚至调用Instance方法来设置文本。有没有办法解决这个问题?

5 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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文档的链接。

答案 2 :(得分:0)

在第一个视图控制器实现文件中导入第二个视图控制器头文件。在第二个视图控制器头文件中导入第一个视图控制器头文件 在第一个视图控制器中创建属性(text / label / whatever)。 在第二个视图控制器中创建第一个视图控制器的属性。 创建第二个视图控制器实例,将第一个视图控制器属性设置为您需要的,将控制器推送到导航控制器。在第二个视图控制器中,在第一个视图控制器中更改所需的内容。允许实例方法。不要忘记释放第一个视图控制器。

委托模式也是这样的。

答案 3 :(得分:0)

视图控制器是对象。对象可以具有可以从其他对象调用的方法,并且它们可以具有实例变量。 (“代表”只是一个奇特的术语。)

没有固有的原因,只要调用者具有被调用者的地址,为什么在视图控制器之间传递数据应该是困难的或复杂的。 (并且给定的VC是否具有XIB是无关紧要的。)

听起来你的真正问题是在将数据传递给被调用者后不知道如何处理数据。

愚蠢的问题:“jCateField”实际上是否与您想要更改的标签相关联,或者它是否为零?如果您从代码创建标签(因为您没有XIB),则需要在创建视图期间将创建的标签的地址存储到“jCateField”中。

答案 4 :(得分:0)

当你回到第一视图控制器时,是否可以发布代码以显示内容。如果日志为您提供正确的值,那么问题在于连接(如果通过iboutlet获取)或者与addsubview。 你的标签是否为零或没有价值(标签是隐藏的)。