0

BSViewControllerソース ivarsnumberarrayを含むビュー コントローラとBSotherViewController、ターゲットとして ivars を受け取る必要があるビュー コントローラがあります。この質問では、目的の結果を生成する1つの方法が提供されました。提案は、ここに示すように指定されたをオーバーライドするself.numberとの値を計算することでした。self.arrayinitinit

- (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)。viewDidLoad私が試したアプローチでは、2 つの値に対して 0 と null しか取得できません。

さらに、次の行viewは、未使用の変数であるという警告の問題を生成します。

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

そのため、最初にivarnumberを計算してarrayから実行するアプローチを探しているinit(WithNumber)ので、同じ変数をターゲットクラスで使用できますBSotherViewController

より直接的なアプローチは useinitではなく、次のようなものを使用することだと思いまし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
4

1 に答える 1

1

ストーリーボード セグエを使用しています。セグエは、ストーリーボードから読み込んで宛先ビュー コントローラーを作成します。-[BSotherViewController initWithNumber:array:]セグエはそれを使用しないため、メソッドを作成しても意味がありません。

ユーザーがボタンをタップしてセグエをトリガーすると、システムは のインスタンスを作成しますUIStoryboardSegue。このセグエ オブジェクトには、destinationViewController(あなたの場合) 表示されるBSotherViewControllerインスタンスになるプロパティがあります。システムprepareForSegue:sender:はソース ビュー コントローラー (your ) にメッセージを送信BSViewControllerし、最初の引数としてセグエ オブジェクトを渡します。

prepareForSegue:sender:で実装する必要がありますBSViewControllerselfこのメソッドでは、ソース ビュー コントローラー ( ) と宛先ビュー コントローラー ( ) の両方にアクセスできる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]、 newnumberarrayプロパティの値を使用して、ビューのコンテンツを設定します。

于 2013-03-12T22:06:40.500 に答える