Положить Ивара в 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
свойства, чтобы установить содержание ваших просмотров.