【问题标题】:iOS: Access Storyboard TabBar ViewController from another ClassiOS:从另一个类访问 Storyboard TabBar ViewController
【发布时间】:2012-02-26 16:39:49
【问题描述】:

我有以下问题: 我使用 Storyboard 创建了一个 iOS 5 SDK 应用程序,其中包含一个 TabBar 和三个 ViewController。 从另一个类(Receiver.m)我想访问一个 UI 标签,例如ThirdViewController.m 是 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 中的 Storyboard 默认命名为 MainStoryboard.storyboard 。 我在获取 ThirdViewController 类实例时做错了吗?

错误提示:

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

谢谢!

【问题讨论】:

    标签: ios storyboard viewcontroller


    【解决方案1】:

    我有一段时间没有关注这个线程,但只是为了那些对其工作原理感兴趣的人,我发布了这个,虽然我不会在我的代码中使用它(感谢上面@jrturton 的 cmets)

    // 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 的回答标记为已接受。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好吧,这就是我所担心的。那么有没有其他方法(我发现像 AppDelegate.window.ThirdViewController 这样的东西也不起作用)以某种方式在 ViewController 的“层次结构”上获取 ThirdViewController 实例?感谢您的推荐,我知道它不是很好的样式,代码会更改,但由于缺少应用程序逻辑,我正在尝试以这种方式直接访问 ViewController。
      • 你必须得到标签栏控制器(app delegate.window 的根视图控制器)然后从标签栏控制器的 viewcontrollers 数组中得到你的第三个视图控制器。
      • AppDelegate.window.UINavigationController.ThirdViewController 没有让我到达那里。有没有人这样做过并且愿意分享一些代码sn-ps?我会很感激的。否则我将不得不更改一些代码的结构。
      • 它更像[appdelegate.window.rootViewController.viewcontrollers objectAtIndex:2],但您可能需要进行一些转换以防止编译器错误。但是,这是错误的方法,您应该按照我在回答中的建议使用委托或通知。
      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        相关资源
        最近更新 更多