【问题标题】:iOS: method to create two viewsiOS:创建两个视图的方法
【发布时间】:2013-08-21 20:29:51
【问题描述】:

我想创建两个并排的视图以添加到我的视图控制器的视图中。为了避免重复代码,我正在尝试编写一个通用方法来为我创建两个视图。但是,此代码对我不起作用。 view1 和 view2 都是 ivars。

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];

  [self makeView:view1];
  [self makeView:view2];
}

- (void)makeView:(UIView*)view {
  CGRect frame = self.view.bounds;
  frame.size.height = frame.size.height/2;
  if (view == view2) {
    frame.origin = CGPointMake(0, frame.size.height);
  }
  view = [[UIView alloc] initWithFrame:frame];
  [self.view addSubview:view];
}

我认为这个问题可能与 line view == view2,某种变量引用错误有关。 view == view2 总是计算为真,所以 view1 永远不会出现。并且在代码的后面部分 view1 和 view2 为 nil。

【问题讨论】:

  • 具体出了什么问题?它会抛出异常吗?碰撞?不显示您的意见?配置错误的视图?控制台中有什么东西吗?
  • == 是一个指针引用。尝试 [查看 isEqual: view2]
  • view1view2 是从 xib 或故事板加载的吗?如果是这样,只需设置它们的框架而不是分配新视图。如果不是,它们是什么(希望是空指针除外)?
  • 我正在以编程方式完成所有工作。
  • 如果它们还没有被分配,你将为 view1 和 view2 传递一个 nil 指针,然后与一个 nil 指针进行比较,这总是正确的。运行时看到 if(nil == nil)

标签: ios


【解决方案1】:

让我们一步一步来找出答案。

首先,正在调用您的viewWillAppear,而view1view2 都是nil,因为您尚未将它们设置为任何值。

然后,您在view1 上调用您的方法,即nil,因此参数将是值nil

您创建框架,然后进入您的 if 语句。参数 (view) 是 nil,正如我们之前所说,view2 也是 nil,因为正如我们之前所说,它以 nil 开头,我们尚未将其设置为任何值。因此,view==view2 为真,因为nil==nil 为真,并且您获得了 view2 所需的原点的框架。

然后,您将 view 设置为新的 UIView 并将其添加到子视图中,这确实添加了视图(您想要的 view2),但您仍然没有设置 view1 变量。

在此之后,您对view2 执行完全相同的操作,这会为您提供具有完全相同帧的另一个视图,因为viewview1view2 仍然是nil

为了绕过这一点,您实际上应该在该方法(view1/2 = [[UIView alloc] init];)之外创建view1view2,并在该方法内部执行所有设置部分。

【讨论】:

    【解决方案2】:

    如果它们还没有被分配,你将为 view1 和 view2 传递一个 nil 指针,然后与一个 nil 指针进行比较,这总是正确的。运行时看到 if(nil == nil)。试试这样的:

    - (void)viewWillAppear:(BOOL)animated {
      [super viewWillAppear:animated];
    
      view1 = [[UIView alloc] init];
      view2 = [[UIView alloc] init];
    
      [self makeView:view1];
      [self makeView:view2];
    }
    
    - (void)makeView:(UIView*)view {
      CGRect frame = self.view.bounds;
      frame.size.height = frame.size.height/2;
      if (view == view2) {
        frame.origin = CGPointMake(0, frame.size.height);
      }
      [view setFrame:frame];
      [self.view addSubview:view];
    }
    

    【讨论】:

      【解决方案3】:

      这是指针的问题。试试这个:

      - (void)testExample
      {
          object = [NSObject new];
          NSLog(@"Address 1: %p", object);
          [self method:object];
      }
      
      - (void) method:(NSObject*) _object {
          NSLog(@"Address 2: %p", _object);
          _object = [NSObject new];
          NSLog(@"Address 3: %p", _object);
          NSLog(@"Address 4: %p", object);
      }
      

      输出类似于

      Address 1: 0xcb98ae0
      Address 2: 0xcb98ae0
      Address 3: 0x11060950
      Address 4: 0xcb98ae0
      

      所以首先你得到对象的指针。然后在method: 中你会得到相同的指针。但是,当您分配一个新对象并将其分配给 _object 或您的 view 时,指针会发生变化,因此您的 ivars view1view2 将保持为零。

      您必须先分配视图,然后再布局它们。

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-02
        相关资源
        最近更新 更多