Objective c Xcode 4.2&;故事板,如何从另一个类访问数据?

Objective c Xcode 4.2&;故事板,如何从另一个类访问数据?,objective-c,ios,xcode,model-view-controller,Objective C,Ios,Xcode,Model View Controller,我想知道如何使用Xcode 4.2和情节提要从另一个类访问数据? 例如,我如何从另一个类访问文本字段的文本? 谷歌没有帮助,MyCodeTeacher.com上关于这一点的教训已经过时,不再有效 谢谢你容忍我 -Shreder2794不确定这是唯一的还是最好的方法,但您可以在目标视图的.h文件中创建一个属性,并在执行segue之前将其设置为一个值 在目标视图控制器的.h文件中: @interface YourDestinationViewController : UIViewController

我想知道如何使用Xcode 4.2和情节提要从另一个类访问数据? 例如,我如何从另一个类访问文本字段的文本? 谷歌没有帮助,MyCodeTeacher.com上关于这一点的教训已经过时,不再有效

谢谢你容忍我


-Shreder2794

不确定这是唯一的还是最好的方法,但您可以在目标视图的.h文件中创建一个属性,并在执行segue之前将其设置为一个值

在目标视图控制器的.h文件中:

@interface YourDestinationViewController : UIViewController
{
    NSString* _stringToDisplay;
    //...
}
    @property (nonatomic, retain) NSString* stringToDisplay;        
    //...
在演示视图的.m文件中

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    YourDestinationViewController*viewController = segue.destinationViewController;
    viewController.delegate = self;
    viewController.stringToDisplay = @"this is the string";
}
然后,您可以在任意一个viewwillappead/viewDidLoad/viewdidappease/etc中对属性执行您想要的操作。方法最适合您在目标视图的.m文件中的用途

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    YourDestinationViewController*viewController = segue.destinationViewController;
    viewController.delegate = self;
    viewController.stringToDisplay = @"this is the string";
}
然后在目标视图控制器的.m文件中检查它是否工作:

-(void)viewWillAppear:(BOOL)animated
{
    NSLog(@"self.stringToDisplay = %@", self.stringToDisplay);
    ...
    //and if a label was defined as a property already you could set the 
    //label.text value here
}

编辑:添加了更多代码,并使其不那么通用

不确定这是唯一的还是最好的方法,但您可以在目标视图的.h文件中创建一个属性,并在执行segue之前将其设置为一个值

在目标视图控制器的.h文件中:

@interface YourDestinationViewController : UIViewController
{
    NSString* _stringToDisplay;
    //...
}
    @property (nonatomic, retain) NSString* stringToDisplay;        
    //...
在演示视图的.m文件中

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    YourDestinationViewController*viewController = segue.destinationViewController;
    viewController.delegate = self;
    viewController.stringToDisplay = @"this is the string";
}
然后,您可以在任意一个viewwillappead/viewDidLoad/viewdidappease/etc中对属性执行您想要的操作。方法最适合您在目标视图的.m文件中的用途

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    YourDestinationViewController*viewController = segue.destinationViewController;
    viewController.delegate = self;
    viewController.stringToDisplay = @"this is the string";
}
然后在目标视图控制器的.m文件中检查它是否工作:

-(void)viewWillAppear:(BOOL)animated
{
    NSLog(@"self.stringToDisplay = %@", self.stringToDisplay);
    ...
    //and if a label was defined as a property already you could set the 
    //label.text value here
}

编辑:添加了更多代码,并使其不那么通用

这不是特定于情节提要的。有几种方法可以做你想做的事情。您可以在AppDelegate(NSString)中声明一个变量,并在第一个类中进行设置。然后在第二个类中访问AppDelegate变量并使用该变量设置标签。执行此操作的代码是:

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
label.text = appDelegate.myString;
另一种方法(可能是最简单的)是在第二个类中声明NSString。然后在第一个类中,在推第二个视图之前设置该字符串变量。大概是这样的:

MyViewController *vc = [[MyViewController alloc] initWithNibName:@"" bundle:nil];
vc.myString = @"";
第三种方法是使用代理。这是最“复杂”的方式,但也是最好的方式。您将创建一个代理,当第二个视图出现时调用该代理。然后,委托可以将第一个类中的值返回给您

您还可以在iOS 5 pushViewController:方法上使用新的完成处理程序块

编辑:

自定义初始化方法:

- (void)initWithNibName:(NSString *)nibName bundle:(NSString *)bundle string:(NSString *)myString

然后,在推送视图时,只需对该方法进行分类并设置字符串即可。

这并不特定于情节提要。有几种方法可以做你想做的事情。您可以在AppDelegate(NSString)中声明一个变量,并在第一个类中进行设置。然后在第二个类中访问AppDelegate变量并使用该变量设置标签。执行此操作的代码是:

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
label.text = appDelegate.myString;
另一种方法(可能是最简单的)是在第二个类中声明NSString。然后在第一个类中,在推第二个视图之前设置该字符串变量。大概是这样的:

MyViewController *vc = [[MyViewController alloc] initWithNibName:@"" bundle:nil];
vc.myString = @"";
第三种方法是使用代理。这是最“复杂”的方式,但也是最好的方式。您将创建一个代理,当第二个视图出现时调用该代理。然后,委托可以将第一个类中的值返回给您

您还可以在iOS 5 pushViewController:方法上使用新的完成处理程序块

编辑:

自定义初始化方法:

- (void)initWithNibName:(NSString *)nibName bundle:(NSString *)bundle string:(NSString *)myString


然后,当你推视图时,只需将这个方法分类并设置字符串。

你到底想做什么?假设我有两个视图控制器,链接到不同的类。我想在第一个视图的文本字段中输入一些文本,然后单击按钮并转到第二个视图。我希望第二个视图上的标签自动更新为我在第一个视图中输入的内容。您到底想做什么?假设我有两个视图控制器,链接到这些单独的类。我想在第一个视图的文本字段中输入一些文本,然后单击按钮并转到第二个视图。我希望第二个视图上的标签自动更新为我在第一个视图中输入的内容。我仍然有问题,您介意用示例代码详细说明吗?添加了更多代码并使其传递字符串,这样看起来更像您正在尝试做的事我仍然有问题,你介意用示例代码详细说明一下吗?添加了更多代码并使其传递一个字符串,这样它看起来更像你要做的事情。我尝试了第二种方法,它似乎在加载新视图时删除了该字符串。我在发送字符串之前和之后,以及在它被罚款之前记录字符串,但是在它只说NULL之后。有什么建议吗?@Shreder2794您是否在第二个类的头中声明了字符串的属性?(@property(强,非原子)NSString*myString)。你合成了吗?@Shreder2794另一种方法是在第二个类中自定义init方法以接受字符串(我添加了更多示例代码),我仍然有这个问题。。。我是个笨蛋。请阅读我在下面发布的源代码,让我知道我做错了什么?这可能是一个非常愚蠢的问题,但你认为这可能是因为我启用了ARC并删除了我的字符串吗?非常感谢你的帮助!我尝试了第二种方法,它似乎在加载新视图时删除了字符串。我在发送字符串之前和之后,以及在它被罚款之前记录字符串,但是在它只说NULL之后。有什么建议吗?@Shreder2794您是否在第二个类的头中声明了字符串的属性?(@property(强,非原子)NSString*myString)。你合成了吗?@Shreder2794另一种方法是在第二个类中自定义init方法以接受字符串(我添加了更多示例代码),我仍然有这个问题。。。我是个笨蛋。请阅读我在下面发布的源代码并