我想创建两个并排视图以添加到我的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。
答案 0 :(得分:1)
让我们一步一步找出答案。
首先,您的viewWillAppear
被调用,view1
和view2
都是nil
,因为您还没有将它们设置为任何内容。
然后,您在view1
上调用您的方法nil
,因此参数将是值nil
。
您创建框架,然后转到if语句。正如我们之前所说,参数(view
)为nil
,view2
也是nil
,因为正如我们之前所说,它始于nil
并且我们还没有把它设置成任何东西。因此,view==view2
为真,因为nil==nil
为真,并且您获得了view2所需的原点框架。
然后,您将view
设置为新的UIView并将其添加到subView,它会添加视图(您想要用于view2),但您仍未设置view1
变量
在此之后,您使用view2
执行完全相同的操作,这会为您提供具有完全相同帧的另一个视图,因为view
,view1
和view2
是仍然nil
。
为了绕过这一点,您实际上应该在该方法之外创建view1
和view2
(view1/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:
中得到相同的指针。但是,当您分配新对象并将其分配给_object
或view
时,指针会发生变化,因此您的ivars view1
和view2
将保持为零。
您必须先分配视图,然后再布局它们。