【问题标题】:How to set properties on initial view controller (created in Storyboard) from AppDelegate?如何从 AppDelegate 设置初始视图控制器(在 Storyboard 中创建)的属性?
【发布时间】:2014-10-15 21:55:06
【问题描述】:

我正在 AppDelegate.m didFinishLauncingWithOptions 方法中调用 API。检索到的 JSON 将被转换为对象的 NSArray。我想将我的第一个视图控制器的属性设置为该数组,以便视图控制器可以使用这些对象的 latitudelongitude 属性来映射位置。

类似这样的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // array retrieved - in actual application, this is an API call and translation
    Obj *object1 = [[Obj alloc] init];
    Obj *object2 = [[Obj alloc] init];
    Obj *object3 = [[Obj alloc] init];

    NSArray *arrayOfObjectsToMap = [NSArray arrayWithObjects:object1, object2, object3, nil];

    // pass object array along to first view controller
    firstController.objectList = arrayOfObjectsToMap;

    return YES;
}

我无法弄清楚如何在 Storyboard 中创建的第一个控制器上设置属性。 AppDelegate 的 self.window.rootViewControllerUIViewController 类型,我的初始控制器是 MapViewController 类型,其 NSArray 属性类似于上面示例中的 objectListproperty。

【问题讨论】:

    标签: ios objective-c appdelegate


    【解决方案1】:

    确保导入视图控制器的头文件:

    #import "MapViewController.h"
    

    然后,因为您知道您的初始视图控制器是 MapViewController 类型,所以只需在表达式中添加一个强制转换:

    ((MapViewController *)firstController).objectList = arrayOfObjectsToMap;
    

    为了更安全,您可以检查视图控制器是否真的是 MapViewController

    if ([firstController isKindOfClass:[MapViewController class]]) {
        ((MapViewController *)firstController).objectList = arrayOfObjectsToMap;
    }
    

    更新

    另一种选择是在您分配 firstController 变量的位置进行强制转换:

    MapViewController *firstController = (MapViewController *)self.window.rootViewController;
    

    【讨论】:

      【解决方案2】:

      您可以使用以下方法通过segue将数据传递给视图控制器。

      -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
          if([segue.identifier isEqualToString:@"showDetailSegue"]){
              ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController;
              controller.isSomethingEnabled = YES;
          }
      }
      

      请关注以下帖子了解更多详情。 Passing Data between View Controllers

      【讨论】:

      • 我知道这就是您使用 segue 在控制器之间传递数据的方式。我相信这是一个不同的情况。这是将数据传递给第一个控制器的 AppDelegate 类 - 据我了解,AppDelegate 和根视图控制器之间不存在任何分隔。
      • @fishfries 你应该改进你的答案,因为它没有解决 OP 问题。
      【解决方案3】:

      我决定通过将创建的对象保存到 Core Data(或者,我可以使用 Singleton 或其他一些存储)并创建我的初始视图控制器来从 Core Data 读取对象来解决这个问题。

      【讨论】:

        猜你喜欢
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多