iOS:从另一个类访问故事板TabBar ViewController
我有以下问题: 我创建了一个包含TabBar和三个ViewController的Storyboard的iOS 5 SDK应用程序。 从另一个类(Receiver.m)中,我想访问例如ThirdViewController.m是TabBar的ViewController之一。iOS:从另一个类访问故事板TabBar ViewController
在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中的我的故事板默认名为MainStoryboard.storyboard。 我在这里得到ThirdViewController类的实例做错了吗?
错误说:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'Storyboard (<UIStoryboard: 0x190590>) doesn't contain a view controller with
identifier 'ThirdViewController''
谢谢!
故事板没有给你一种访问视图控制器已经呈现的版本的方法 - 正如你发现的那样,你正在使用的方法创建一个新的实例。
如果您期待外部对象更新属于视图控制器的特定标签,我会怀疑代码的结构。这不是典型的设计模式,因为它使两个对象之间紧密相关。通常,您将视图控制器设置为Receiver对象的委托(如果它是由该视图控制器创建的),或者您的接收器对象会发送第三个视图控制器正在侦听的通知。
我没有关注此线程一段时间,但只是对那些有兴趣的人如何工作我做了这个帖子,虽然我不会在我的代码中使用这个(感谢上面的@jrturton评论)
// 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的答案为接受。
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.
}
斯威夫特3,Xcode中8,iOS的10
好吧,这是我担心的。那么有没有其他的方式(我发现像AppDelegate.window.ThirdViewController这不起作用),以某种方式获得ThirdViewController实例通过ViewController'层次'?感谢您的建议,我知道这样的事实,它不是好的风格,代码会改变,但由于应用程序逻辑丢失,我试图直接访问ViewController。 – ZCDev 2012-02-04 09:30:01
你必须得到标签栏控制器(应用程序委托的根视图控制器。窗口),然后从标签栏控制器的viewcontrollers数组中获取第三个视图控制器。 – jrturton 2012-02-04 09:54:07
'AppDelegate.window.UINavigationController.ThirdViewController'不会让我那里。有没有人曾经这样做,并愿意分享一些代码片段?我将不胜感激。否则,我将不得不改变一些代码的结构。 – ZCDev 2012-02-05 18:08:41