【问题标题】:Xcode 4.2 & Storyboard, how to access data from another class?Xcode 4.2 & Storyboard,如何访问另一个类的数据?
【发布时间】:2012-03-27 21:02:47
【问题描述】:

我想知道如何使用 Xcode 4.2 和 Storyboard 从另一个类访问数据? 例如,我将如何从另一个类访问文本字段的文本? Google 没有提供帮助,MyCodeTeacher.com 上关于这方面的课程已经过时并且不再有效......

感谢您对我的包容!

-Shredder2794

【问题讨论】:

  • 你到底想做什么?
  • 假设我有 2 个视图控制器,链接到单独的类。我想在第一个视图的文本字段中输入一些文本,然后单击一个按钮并转到第二个视图。我希望第二个视图上的标签自动更新为我在第一个视图中输入的内容。

标签: objective-c ios xcode model-view-controller


【解决方案1】:

这不是 Storyboard 特有的。有几种方法可以做你想做的事情。您可以在 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 之后对字符串进行 NSLog。有什么建议吗?
  • @Shredder2794 您是否在第二类的标题中声明了字符串的属性? (@property(强,非原子)NSString *myString)。你合成了吗?
  • @Shredder2794 另一种方法是自定义第二个类中的 init 方法以接受字符串(我添加了更多示例代码)
  • 我仍然有这个问题......我是个菜鸟。请阅读我在下面发布的源代码,让我知道我做错了什么?
  • 这可能是一个非常愚蠢的问题,但你认为这可能是因为我启用了 ARC 并删除了我的字符串吗?非常感谢您的帮助!
【解决方案2】:

不确定这是唯一还是最好的方法,但您可以在目标视图的 .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";
}

然后,您可以对 viewWillAppear/viewDidLoad/viewDidAppear/etc 中的任何一个中的属性执行您想要的操作。方法最适合您在目标视图的 .m 文件中的目的

然后检查它是否有效,在目标视图控制器的 .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
}

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

【讨论】:

  • 我仍然有这个问题,你介意用示例代码详细说明吗?
  • 添加了更多代码并使其传递了一个字符串,因此它看起来更像您正在尝试做的事情
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多