初始化时设置属性

时间:2012-12-30 23:02:00

标签: iphone ios properties uiviewcontroller

我正在创建一个视图控制器的实例,然后在另一个视图上以模态方式呈现它:

[viewController receiveNumber1:number1 andNumber2:number2];
[viewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[self presentModalViewController:viewController animated:YES];

我想要做的是在初始化时在这个新视图控制器中设置两个属性。

我可以通过调用一个自定义方法来做到这一点(这里有一些int变量):

[viewController methodProperty1:something1 andProperty2:something2];

但是,我真的需要在初始化时设置这些属性,因为新视图的内容取决于这些数字。

有没有办法在初始化时将信息传递给新视图?类似的东西:

[[UIViewController alloc] initWithValue1:something1 andValue2:something2];

另外,我不明白为什么

CustomViewController *view = [[CustomViewController alloc] init];
view.property = newValue; / [view setProperty:newValue];

在此配置中不起作用,这意味着属性的值不会更改。我可以在新视图中调用方法并以这种方式设置其属性但不直接设置属性?

如果这些是蹩脚的问题,我很抱歉,但我是初学者。

非常感谢!

2 个答案:

答案 0 :(得分:3)

  1. view.property = newValue[view setProperty:newValue]是等同的术语。
  2. 您可以为视图控制器实现一个或多个自定义初始化方法,没有什么可以阻止这样做。请查看official doc,确保您遵守有关如何实施自定义初始值设定项的一些规则。
  3. 您的代码段:

    -(id)initWithValue1:(NSInteger)value1 andValue2:(NSInteger)value2
    {
        if (self = [super init])
        {
            _firstValue = value1;
            _secondValue = value2;
            return self;
        }
        else return nil; // or handle the error
    }
    

答案 1 :(得分:2)

CustomViewController.h中,定义要设置的两个属性和初始化方法,例如:

@property (nonatomic, assign) NSInteger firstValue;
@property (nonatomic, assign) NSInteger secondValue;

-(id)initWithFirstValue:(NSInteger)value1 andSecondValue:(NSInteger)value2;

然后,在CustomViewController.m中,实现您之前声明的方法:

-(id)initWithFirstValue:(NSInteger)value1 andSecondValue:(NSInteger)value2
{
    self = [super init];
    if (self)
    {
        // Supposing you haven't synthesized your property and you are using
        // latest Xcode build, instance variable are automatically created
        _firstValue = value1;
        _secondValue = value2;
    }
    return self;
}

最后,您可以使用以下代码行分配控制器:

CustomViewController *controller = [[CustomViewController alloc] initWithFirstValue:value1ToSet andSecondValue:value2ToSet];

一些最终建议
实施自定义初始化方法时,应正确选择init上必须调用的super
例如,如果我的控制器是UIViewController的子类,我更喜欢调用self = [super initWithFrame:CGRectZero];,如果它是UITableViewController的子类,我更喜欢调用self = [super initWithStyle:UITableViewStylePlain];。 还有其他自定义init方法,但您可以找到有关自定义控制器超类的其他信息阅读文档。