2013-03-12 3 views
0

У меня есть два контроллера вида: BSViewController, который содержит исходные ivars number и array и BSotherViewController, которые, как цель, должны получить ивары. One way of producing the desired result was provided in this question. Было предложено вычислить значения self.number и self.array в init, который переопределяет обозначенный init, как показано здесь.установка ivars в 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 и null для их двух значений в viewDidLoad с любым подходом, который я пробовал.

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

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

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

Я думал, что более прямой подход был бы не использовать init, но вместо того, чтобы использовать что-то вроде следующего initWithNumber, но я не могу показаться, чтобы сделать эту работу со всеми требованиями ARC для использования подчёркивания, и мое ограниченное понимание Objective-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 
+0

Назначенный инициализатор для 'BSViewController' является' initWithNibName: bundle: ', поэтому вы переопределяете это, а не' init'. – mipadi

+0

В другом вопросе вы сказали, что «BSViewController» имеет кнопку на нем, которая переходит к «BSotherViewController». Вы имели в виду, что вы используете раскадровку и создали отступ от кнопки «BSotherViewController»? –

+0

Да, я использую раскадровку. Комментарий Wrt mipadi: Это поможет мне ближе к ответу, который я хочу. Я думаю, что я действительно должен использовать класс «model» вместо класса «controller», но на данный момент я просто пытаюсь получить какой-то тест для работы. Мои две переменные 'number' и' array' вычисляются в этом VC и используются в одном другом VC. Я просто пытаюсь выработать логистику получения от первого до последнего. Я понятия не имел, что у меня будет такая большая проблема. – zerowords

ответ

1

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

Когда пользователь запускает сеанс путем нажатия кнопки, система создает экземпляр UIStoryboardSegue. Этот объект segue имеет свойство 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 свойств, чтобы установить содержание ваших взглядов.

+0

Этот первый параграф в вашем ответе озадачивает меня: я не думал о создании '- [BSotherViewController initWithNumber: array:]' в 'BSotherViewController', но в' BSViewController'. Я что-то упускаю? Тем не менее, я все еще перевариваю вам ответ. Благодарю. – zerowords

+0

Тогда я неправильно понял ваш план. Я не понимаю, почему вы поместили этот метод в «BSViewController», поскольку (я полагаю) «BSViewController» загружается из вашей раскадровки, а загрузчик раскадровки не будет использовать ваш собственный метод «initWithNumber: array:» , –

+0

Я попытался реализовать вашу подготовку к segue, и я не получаю никаких новых ошибок, но я не получаю информацию от BSESController до 'BSotherViewController'. В моем реальном приложении я получаю из раскадровки URL-адрес, в котором есть текст, который я анализирую в 'BSViewController' и помещаю в' array' и вычисляю 'number' также. Но тогда результаты необходимы для реакции пользователя в «BSotherViewController». – zerowords