【问题标题】:needing a viewcontroller to exist before passing an object to it在将对象传递给它之前需要存在视图控制器
【发布时间】:2014-02-28 03:44:45
【问题描述】:

我首先为可能没有多大意义或非常明显的问题标题道歉。我有一个tabbarcontroller,上面有两个视图(view1view2)。它从view1 开始作为初始视图。我需要将一些东西从view1 传递给view2,感谢这个很棒的社区=]。但是,当我运行模拟器时,当我从 view1 开始时,如果我当时在那里传递对象,什么都不会发生,但是如果我先去“看到”view2 然后再回到view1,对象是收到完美。我认为这是view2array2 最初不存在的问题,直到我实际要求查看它,因为它是在viewDidLoad 中初始化的。任何帮助表示赞赏。谢谢。

这是我在 view2 中的 viewDidLoad:

[super viewDidLoad];
// Do any additional setup after loading the view.

self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

self.array2 =[[NSMutableArray alloc]init];

这是在 view1 中按下按钮的方法,将对象提供给 view2:

            object = [self.array1 objectAtIndex:15];
            UINavigationController *navi = (UINavigationController *)[[self.tabBarController viewControllers] objectAtIndex:1];
            SecondViewController *secViewController = [[navi viewControllers] objectAtIndex:0];

            [secViewController.array2 addObject:object];
            [secViewController.tableView reloadData];

我“认为问题在于我应该早于viewDidLoad 初始化array2,我猜这将在viewController 的初始化中。我不知道该怎么做,我的VC2.m 没有有一个 init 方法,我不确定如何在进入此屏幕之前将其初始化为 array2

【问题讨论】:

  • 如果您发布您正在使用的代码以提供一些解决方案会有所帮助。
  • ^已更新,如果您需要其他代码,请告诉我。谢谢
  • “什么都没有发生”是什么意思?是什么让你认为这个对象没有传递给视图控制器?你期望会发生什么,你看到了什么?也许最重要的是,您如何检验您的假设?
  • 我在vc2的array2中放置了一个初始对象:dummy。当事件的顺序去:运行模拟器,vc1(这是初始屏幕),将对象发送到array2,vc2。我所看到的只是我初始化 vc2 的假人。当事件顺序发生时:运行模拟器、vc1、vc2(我在这里看到了虚拟对象)、vc1、将对象发送到数组2、vc2(我现在看到了虚拟对象和新对象)
  • 你对问题的分析是正确的。那么你不知道该怎么做呢?写一个init方法?您使用哪种初始化方法取决于控制器的创建方式。如果您在情节提要中进行此操作,则应使用 initWithCoder,如果在 xib 文件中,则使用 initWithNibName:bundle:,如果在代码中,则仅使用 init。

标签: ios uiviewcontroller


【解决方案1】:

使用 initWithCoder:因为您的控制器是在 IB 中制作的。将此代码放入 vc2 .m 文件中。

-(id)initWithCoder:(NSCoder *) aDecoder {
   if (self = [super initWithCoder: aDecoder]) {
        _array2 =[[NSMutableArray alloc]init];
   }
   return self;
}

【讨论】:

    【解决方案2】:

    在选项卡视图控制器中,仅当该视图可见时才加载视图。所以当你的应用程序第一次午餐时,它只加载第一个视图。不会加载第二个视图。所以你的第二个视图控制器的 -viewDidLoad 不会被调用。因此,您的阵列此时未启动。

    所以你需要在init方法中分配数组。

     -(id)init
    {
       self = [super init];
       if(self) 
       {
            _array2 =[[NSMutableArray alloc]init];
       }
       return self;
    }
    

    我认为它会起作用,如果不在其他 init 方法中编写这一行。

    【讨论】:

    • 当我在 vc2 中编写此代码时,在 vc2 中根本不再显示 tableview。它只是带有 navBar 和 tabBar 的视图。我假设你的方法是正确的,但是为什么我在 vc2 中的 tableView 只有在我在 viewDidLoad 中初始化 array2 时才会出现? vc2 tableview 在 vc2 中被列为属性(强,非原子)IBOutlet。
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多