iOS:从另一个类访问Storyboard TabBar ViewController

时间:2012-02-04 07:30:54

标签: ios storyboard viewcontroller

我有以下问题: 我创建了一个带有Storyboard的iOS 5 SDK应用程序,其中包含一个TabBar和三个ViewControllers。 从另一个类(Receiver.m)我想访问例如UI标签ThirdViewController.m,它是TabBar的一个ViewControllers。

在ThirdViewController.h中我得到了

@interface ThirdViewController : UIViewController {
}
@property (weak, nonatomic) IBOutlet UILabel *textlabel1;
@end

并在ThirdViewController.h中:

@implementation ThirdViewController
@synthesize textlabel1;
...

这似乎没问题,因为我可以在ThirdViewController实例中设置标签属性。 现在要从Receiver.m中获取访问权限,我使用:

   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
   ThirdViewController *myVC = [storyboard instantiateViewControllerWithIdentifier:@"ThirdViewController"];
   myVC.textlabel1.text = @"Hello"; 

这不起作用。我不想创建一个新的ThirdViewController实例,但访问现有的实例只更新UILabel。 Project Navigator中的My Storyboard默认名为MainStoryboard.storyboard。 我在获取ThirdViewController类实例时做错了吗?

错误说:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'Storyboard (<UIStoryboard: 0x190590>) doesn't contain a view controller with 
identifier 'ThirdViewController''

谢谢!

3 个答案:

答案 0 :(得分:3)

我暂时没有关注这个帖子,但是对于那些感兴趣的人我会发布这个帖子,虽然我不会在我的代码中使用它(感谢@jrturton上面的评论)< / p>

// Bad style:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSArray *vcs = appDelegate.window.rootViewController.childViewControllers;   
YourFirstViewController *fvc  = [vcs objectAtIndex:0];
YourSecondViewController *svc = [vcs objectAtIndex:1];

因此,我将jrturton的答案标记为已被接受。

答案 1 :(得分:2)

Storyboard不会为您提供访问已呈现的视图控制器版本的方法 - 正如您所发现的,您使用的方法会创建一个新实例。

如果您希望外部对象更新属于视图控制器的特定标签,我会质疑代码的结构。这不是典型的设计模式,因为它在两个对象之间产生紧密的依赖关系。通常,您将视图控制器设置为Receiver对象的委托(如果它由该视图控制器创建),或者您的接收器对象将发送第三个视图控制器正在侦听的通知。

答案 2 :(得分:0)

ZCDev's回答对我不起作用。这很有效:

let tabBarViewController = UIApplication.shared.windows.first!.rootViewController as!   UITabBarController

更安全的选项:

if let tabBarViewController = UIApplication.shared.windows.first?.rootViewController as? UITabBarController {
    // access your tab bar controller here.
}

Swift 3,Xcode 8,iOS 10