iOS:创建两个视图的方法
我想创建两个并排的视图添加到我的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的后面部分是零。
让我们一步一步找出答案。
首先,你viewWillAppear
被调用,并view1
和view2
都是nil
,因为你没有将它们设置为任何事情。
然后,你打电话给你的方法view1
,这是nil
,所以参数将是值nil
。
创建框架,然后让你的if语句。参数(view
)为nil
,正如我们之前所说的,和view2
也nil
,因为正如我们前面所说,它开始为nil
,我们还没有将其设置为任何事情。因此,view==view2
为真,因为nil==nil
为真,并且您获得了view2所需的原始帧。
然后,您将view
设置为一个新的UIView,并将其添加到子视图中,该子视图会添加视图(即view2所需的视图),但您仍未设置view1
变量。
在此之后,你与view2
做同样的事情,它给你使用完全相同的框架另一种观点认为,因为view
,view1
和view2
都还nil
。
为了避免这种情况,实际上应该在该方法之外创建view1
和view2
(view1/2 = [[UIView alloc] init];
),并且只需执行方法内的所有设置部分即可。
如果它们还没有被分配,你会路过一个零指针两个厂景和视图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];
}
这是一个指针的问题。试试这个:
- (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 view1
和view2
将保持零。
您必须首先分配视图并进行布局。
什么,具体是出错了?它是否会抛出异常?崩溃?不显示您的意见?配置错误的视图?控制台中的任何东西? – Tim
==是一个指针引用。尝试[view isEqual:view2] – acorc
是从xib还是storyboard加载'view1'和'view2'?如果是这样,只需设置其框架而不是分配新视图。如果不是,他们是什么(除了空指针,希望)? –