iOS:创建两个视图的方法

时间:2013-08-19 22:19:22

标签: ios

我想创建两个并排视图以添加到我的viewcontroller视图中。为了避免重复代码,我正在尝试编写一个通用方法来为我创建两个视图。但是,这段代码对我来说并不适合。 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];
}

我认为这个问题可能会处理行视图== view2,某种变量引用错误。 view == view2始终计算结果为true,因此view1永远不会显示。在代码的后面部分,view1和view2都是nil。

3 个答案:

答案 0 :(得分:1)

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

首先,您的viewWillAppear被调用,view1view2都是nil,因为您还没有将它们设置为任何内容。

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

您创建框架,然后转到if语句。正如我们之前所说,参数(view)为nilview2也是nil,因为正如我们之前所说,它始于nil并且我们还没有把它设置成任何东西。因此,view==view2为真,因为nil==nil为真,并且您获得了view2所需的原点框架。

然后,您将view设置为新的UIView并将其添加到subView,它会添加视图(您想要用于view2),但您仍未设置view1变量

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

为了绕过这一点,您实际上应该在该方法之外创建view1view2view1/2 = [[UIView alloc] init];),并且只需要在其中创建所有设置部分方法

答案 1 :(得分:0)

如果还没有分配它们,你将为view1和view2传递一个nil指针,然后与一个nil指针进行比较,这将始终为true。运行时看到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];
}

答案 2 :(得分:0)

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

- (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:中得到相同的指针。但是,当您分配新对象并将其分配给_objectview时,指针会发生变化,因此您的ivars view1view2将保持为零。

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