3

我创建了一个使用大量容器视图的应用程序。今天我发现 iOS 5 不支持嵌入式 segue(感谢 Xcode 让我知道。)所以现在我有很多嵌入式 segue 在彼此之间传递数据。

我正在使用此代码将 ViewControllers 加载到 UIView 中,而不是 IB 中的 Container 中:

根视图控制器:

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
    news.view.frame = self.newsSection.bounds;
    [self.newsSection addSubview:news.view];
    [self addChildViewController:news];
    [news didMoveToParentViewController:self];
    // Do any additional setup after loading the view.
}

如何使用上述内容并仍将数据传递给 NewsViewController(类似于为 segue 做准备)

我试过在上面插入类似的东西

        NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
        news.view.frame = self.newsSection.bounds;
        news.myLabel.text = @"Test";
        [self.newsSection addSubview:news.view];

但标签不会改变。

我更喜欢只传递数据而不使用单例或委托。

谢谢

4

3 回答 3

1

问题可能是在您设置标签文本的那一刻,标签仍然是nil.

尝试将一个添加NSString property到您的NewsViewController(例如 labelText)中,然后在viewDidLoaddo中添加一个self.myLabel.text = self.labelText;

于 2013-07-25T10:30:51.757 回答
1

我建议创建一个公共方法,您可以通过该方法在NewsViewController控制器上传递所需的数据。不过,现在的问题是您在初始化 UI 之前正在更新它。另外我建议您看看如何创建内容UIViewControllers,因为现在您只是添加它的UIView. 查看Apple 的此文档,查看实现自定义容器视图控制器部分。而这部分代码:

- (void) displayContentController: (UIViewController*) content;
{
   [self addChildViewController:content];                 // 1
   content.view.frame = [self frameForContentController]; // 2
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];          // 3
}

因此,在您的情况下,在完成第 3 步之后,您可以在NewsViewController.

于 2013-07-25T10:34:01.820 回答
0

您已将字符串传递给您的下一个视图控制器,并将 viewDidLoad 传递给该字符串。
它不起作用,因为您的视图尚未创建,如果检查 UIlabel 的实例,它将为零。因此,当它加载到内存中时,您已经在下一个视图控制器中设置了文本。

编辑 您在 NewsViewController 中创建了一个 NSString 类型(textString)的属性变量并将字符串传递为news.textString = @"Test";

并且 NewsViewController 的 ViewDidLoad 将该字符串设置为标签为 myLabel.text = textString;

更好的解释

- 在 NewsViewController.h 中声明 NSString 属性

@property (strong, nonatomic) NSString *assignText;

- 正常实例化,但分配字符串而不是标签。

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
    news.assignText = @"Test";
    [self addChildViewController:news];

- 然后在您的 NewsViewController viewDidload 中,将标签分配给字符串。

-(void)viewDidLoad {
  [super viewDidLoad];
  self.myLabel.text = self.assignText;
}
于 2013-07-25T10:31:45.437 回答