2013-08-19 43 views
1

我想创建两个并排的视图添加到我的viewcontroller的视图。为了避免重复代码,我试图编写一个通用的方法为我创建两个视图。但是,这段代码并不适合我。 view1和view2都是ivars。iOS:创建两个视图的方法

- (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]; 
} 

我认为这个问题可能处理线视图==视图2,某种变量引用错误的。 view == view2总是计算为true,所以view1从不出现。在代码view1和view2的后面部分是零。

+0

什么,具体是出错了?它是否会抛出异常?崩溃?不显示您的意见?配置错误的视图?控制台中的任何东西? – Tim

+0

==是一个指针引用。尝试[view isEqual:view2] – acorc

+0

是从xib还是storyboard加载'view1'和'view2'?如果是这样,只需设置其框架而不是分配新视图。如果不是,他们是什么(除了空指针,希望)? –

回答

1

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

首先,你viewWillAppear被调用,并view1view2都是nil,因为你没有将它们设置为任何事情。

然后,你打电话给你的方法view1,这是nil,所以参数将是值nil

创建框架,然后让你的if语句。参数(view)为nil,正如我们之前所说的,和view2nil,因为正如我们前面所说,它开始为nil,我们还没有将其设置为任何事情。因此,view==view2为真,因为nil==nil为真,并且您获得了view2所需的原始帧。

然后,您将view设置为一个新的UIView,并将其添加到子视图中,该子视图会添加视图(即view2所需的视图),但您仍未设置view1变量。

在此之后,你与view2做同样的事情,它给你使用完全相同的框架另一种观点认为,因为viewview1view2都还nil

为了避免这种情况,实际上应该在该方法之外创建view1view2view1/2 = [[UIView alloc] init];),并且只需执行方法内的所有设置部分即可。

0

如果它们还没有被分配,你会路过一个零指针两个厂景和视图2,然后针对零指针,这将永远是真实的比较。运行时会看到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]; 
} 
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将保持零。

您必须首先分配视图并进行布局。