我有以下问题: 我创建了一个带有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''
谢谢!
答案 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