Положить Ивара в init

У меня есть два вида контроллеров: BSViewController который содержит исходный ивар number а также array, а также BSotherViewController который в качестве цели должен получить ивары. В этом вопросе был представлен один из способов получения желаемого результата. Было предложено рассчитать значения self.number а также self.array в init который отменяет назначенный 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.array в оригинальном методе (viewDidLoad); Я могу получить только 0 и ноль для их двух значений в viewDidLoad с любым подходом я пробовал.

Кроме того, следующая строка выдает предупреждение, которое view является неиспользуемой переменной

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

Поэтому я ищу подход, который сначала вычисляет мои ивары number а также array а затем выполняет init(WithNumber) так что те же переменные могут быть использованы в целевом классе BSotherViewController,

Я думал, что более прямой подход не будет использоваться init, но вместо этого использовать что-то вроде следующего initWithNumber но я не могу заставить это работать со всеми требованиями ARC для использования подчеркивания и моим ограниченным пониманием цели-c.

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

Для полноты я приведу ниже большую часть кода, который был создан в ответе на предыдущий вопрос.

BSViewController.h

#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

BSViewController.m

#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.h

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

BSotherViewController.m

#import "BSotherViewController.h"
#include "BSViewController.h"
@interface BSotherViewController ()
@end

@implementation BSotherViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    BSViewController *aview = [[BSViewController alloc] init];
    NSLog(@"other view: %@", self.aview);
    NSLog(@"other number: %d", aview.number);
    NSLog(@"other array: %@", aview.array);
}
@end

1 ответ

Решение

Вы используете раскадровку. Segue создаст контроллер представления назначения, загрузив его из раскадровки. Нет смысла создавать -[BSotherViewController initWithNumber:array:] метод, потому что Segue не будет использовать его.

Когда пользователь запускает переход, нажав кнопку, система создает экземпляр UIStoryboardSegue, Этот объект имеет destinationViewController собственность, которая будет (в вашем случае) BSotherViewController экземпляр, который вот-вот появится. Система отправляет prepareForSegue:sender: сообщение в контроллер представления источника (ваш BSViewController) и передает объект segue в качестве первого аргумента.

Вам необходимо реализовать prepareForSegue:sender: в BSViewController, В этом методе у вас есть доступ как к контроллеру представления источника (self) и контроллер вида назначения (segue.destinationViewController), так что вы можете передавать данные от одного к другому.

Сначала добавьте number а также array свойства к 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], используйте значения вашего нового number а также array свойства, чтобы установить содержание ваших просмотров.

Другие вопросы по тегам