将ivars放入init

时间:2013-03-12 21:44:15

标签: objective-c ivar

我有两个视图控制器:BSViewController,其中包含源ivars numberarray,以及BSotherViewController,它们作为目标需要接收ivars。 One way of producing the desired result was provided in this question.建议是计算self.numberself.arrayinit的值,这些值会覆盖指定的init,如此处所示。

- (id)init {

    if (self = [super init]) {
        //Set values
        NSArray*  _array = [NSArray arrayWithObjects: @"manny",@"moe",nil];
        self.array = _array;
        self.number = 25;
    }
    return self;
}

但我不知道这个解决方案如何在原始方法(self.number)中计算self.arrayviewDidLoad;我只能用viewDidLoad中的两个值得到0和null,我尝试过任何方法。

此外,以下行会产生警告问题,view是未使用的变量。

BSViewController *view = [[BSViewController alloc] init];

所以我正在寻找一种方法,首先计算我的ivars numberarray,然后执行init(WithNumber),以便在目标类{{1}中使用相同的变量}}

我认为更直接的方法不是使用BSotherViewController,而是使用类似下面init的内容,但我似乎无法使用所有ARC要求使用下划线,以及我对objective-c的理解有限。

initWithNumber

为了完整起见,我将在下面的问题的答案中生成的大部分代码下面重现。

BSViewController.h

- (id)initWithNumber:(NSInteger)number array:(NSArray *)array
{
    self = [super init];
    if (self) {
        _number = number;
        _array = array;
        return self;
    }
    return nil;
}

BSViewController.m

#import <UIKit/UIKit.h>

@interface BSViewController : UIViewController{
   // NSInteger number;
}

@property (nonatomic) NSInteger number;
@property (nonatomic, weak) NSArray * array;
// - (id)initWithNumber:(NSInteger)number array:(NSArray *)array;
@end

BSotherViewController.h

#import "BSViewController.h"
@interface BSViewController ()
@end
@implementation BSViewController
@synthesize number;
@synthesize array;
/*
- (id)initWithNumber:(NSInteger)number array:(NSArray *)array
{
    self = [super init];
    if (self) {
        _number = number;
        _array = array;
        return self;
    }
    return nil;
}
*/
- (id)init {
    if (self = [super init]) {
        NSArray*  _array = [NSArray arrayWithObjects: @"manny",@"moe",nil];
        self.array = _array;
        self.number = 25;
    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"self: %@", self);
    BSViewController *view = [[BSViewController alloc] init];  //Warning issued: unused variable
    NSLog(@"self number: %d", self.number);
    NSLog(@"self array: %@", self.array);
}
@end

BSotherViewController.m

#import <UIKit/UIKit.h>
@class BSViewController;
@interface BSotherViewController : UIViewController
@property (strong, nonatomic) BSViewController *aview;
@end

1 个答案:

答案 0 :(得分:1)

你正在使用故事板segue。 segue将通过从故事板加载目标视图控制器来创建目标视图控制器。创建-[BSotherViewController initWithNumber:array:]方法没有意义,因为segue不会使用它。

当用户通过点击按钮触发segue时,系统会创建UIStoryboardSegue的实例。此segue对象具有destinationViewController属性,在(在您的情况下)将是即将出现的BSotherViewController实例。系统向源视图控制器(您的prepareForSegue:sender:)发送BSViewController消息,并将segue对象作为第一个参数传递。

您需要在prepareForSegue:sender:中实施BSViewController。在该方法中,您可以访问源视图控制器(self)和目标视图控制器(segue.destinationViewController),因此您可以将数据从一个传递到另一个。

首先,将numberarray属性添加到BSotherViewController。然后,将此类方法添加到BSViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // The identifier here must match the one you assigned to the segue in the storyboard.
    if ([segue.identifier isEqualToString:@"GoingToOtherViewController"]) {
        BSotherViewController *destination = segue.destinationViewController;
        destination.number = self.number;
        destination.array = self.array;
    }
}

最后,在-[BSotherViewController viewDidLoad]中,使用新numberarray属性的值来设置观看内容。