【问题标题】:Setting Property upon Initialization初始化时设置属性
【发布时间】:2012-12-15 06:12:33
【问题描述】:

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

[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];

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

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

非常感谢!

【问题讨论】:

  • 首先,“XYZ 在此配置中不起作用。” - 准确的说?编译器错误?运行时错误?意外的结果/行为?二。 “类似initWithBlah:” - 是什么阻止您在子类中实现该方法?
  • 两者应该是等价的。但是,为什么不继续编写自定义初始化方法呢? (对不起英语,我也是匈牙利人,但这是这样的政策。)
  • 您设置这些属性的方式应该有效。你错过了别的东西。你是如何呈现 viewController 的?代码还是segue?
  • 代码,我不使用IB。我将代码添加到我的问题中。
  • @GergelyKovacs “我不使用 IB”——你摇滚。真的。 (你会被问好几次,为什么不呢。做好准备。)

标签: iphone ios properties uiviewcontroller


【解决方案1】:
  1. view.property = newValue[view setProperty:newValue] 是等效的术语。
  2. 您可以为您的视图控制器实现一种或多种自定义初始化方法,没有什么可以阻止这样做的。查看official doc 以确保您遵守有关如何实现自定义初始化程序的一些规则。

你的代码 sn-p:

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

【讨论】:

【解决方案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];

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

【讨论】:

  • 在构造方法中使用属性是一种不好的做法。改为设置 ivar。 More on the subject.
  • 谢谢伙计,这似乎正是我所需要的。一旦我确认它有效,我会试一试并选择你作为正确答案(虽然,从它的外观来看,我不明白为什么它不会...... :)。
  • @GabrielePetronella 你是对的,即使我有时在 init 方法中使用属性而没有问题......但是,我已经编辑了答案。谢谢!
  • GabrielePetronella 这是正确的,因为您在初始化阶段不知道您的财产状态
  • 它在 90% 的情况下都能完美运行,但仍然是一种不好的做法,可能会导致意外行为;)
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多