Iphone 初始化时设置属性

Iphone 初始化时设置属性,iphone,ios,properties,uiviewcontroller,Iphone,Ios,Properties,Uiviewcontroller,我正在创建一个视图控制器的实例,然后在另一个视图上以模式显示它: [viewController receiveNumber1:number1 andNumber2:number2]; [viewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve]; [self presentModalViewController:viewController animated:YES]; 我想做的是在初始化时在这个新的

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

[viewController receiveNumber1:number1 andNumber2:number2];
[viewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[self presentModalViewController:viewController animated:YES];
我想做的是在初始化时在这个新的视图控制器中设置两个属性

我可以通过调用自定义方法来实现这一点,如(这里有些是int变量):

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

在初始化新视图时,是否有方法将信息传递给新视图?比如:

[[UIViewController alloc] initWithValue1:something1 andValue2:something2];
还有,我不明白为什么

CustomViewController *view = [[CustomViewController alloc] init];
view.property = newValue; / [view setProperty:newValue];
在此配置中不起作用,这意味着属性的值不会更改。我可以在新视图中调用方法并以此方式设置其属性,但不能直接设置属性

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


非常感谢

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

例如,我更喜欢调用
self=[super initWithFrame:CGRectZero]如果我的控制器是UIViewController的子类,或
self=[super initWithStyle:UITableViewStylePlain]如果它是UITableViewController的子类。
还有其他自定义init方法,但您可以在阅读有关自定义控制器超类的文档时找到其他信息

  • view.property=newValue
    [view-setProperty:newValue]
    是等效的术语
  • 您可以为视图控制器实现一个或多个自定义初始化方法—没有任何东西可以停止这样做。查看以确保遵守关于如何实现自定义初始值设定项的两条规则
  • 您的代码片段:

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

    首先,“XYZ在此配置中不工作。”-准确地说?编译器错误?运行时错误?意外的结果/行为?两个。“类似于
    initWithBlah:
    ”-是什么阻止您在子类中实现该方法?两者应该是等效的。但是,您为什么不继续编写自定义初始化方法呢?(为英国人感到抱歉,我也是匈牙利人,但这是一项非常严格的政策。)您设置这些属性的方式应该有效。你错过了一些别的东西。如何演示viewController?代码还是segue?代码,我不使用IB。我将代码添加到我的问题中。@GergelyKovacs“我不使用IB”-你太棒了。真正地(有人会多次问你为什么不这样做。请做好准备。)在构造函数方法中使用属性是一种糟糕的做法。改为设置ivar。谢谢,伙计,这似乎正是我需要的。我试了一下,一旦我确认它有效,我就选择你作为正确的答案(尽管,从外观上看,我不明白为什么它不会…:)@GabrielePetronella你是对的,即使我有时在init方法中使用属性时没有问题。。。不过,我已经编辑了答案。谢谢GabrielePetronella这是正确的,因为您不知道在初始化阶段您的财产的状态。在90%的情况下,它将完美地工作,仍然是一种不好的做法,可能会导致意外行为;)现在没关系了,您仍然可以通过在末尾返回
    self
    来避免double
    return
    语句。如果失败,[super init]是否一定会返回nil?按照惯例,是的。当然,除非它引发了一个例外,但在这种情况下,它将永远不会回来。我想这两种方法都是正确的
    -(id)initWithValue1:(NSInteger)value1 andValue2:(NSInteger)value2
    {
        if (self = [super init])
        {
            _firstValue = value1;
            _secondValue = value2;
            return self;
        }
        else return nil; // or handle the error
    }