0

viewcontroller.m には次のコードがあります

- (void)viewDidLoad
{
[super viewDidLoad];


self.array=[[NSArray alloc]initWithObjects:@"hi",@"hello", nil];
NSLog(@"%@",self.array);

view *view1=[[view alloc]init];
[view1 addSubview:self.view];
 view1.viewController=self;

}

そして、配列にアクセスしようとしている別の UIView クラスがあります: .h ファイル:

#import <UIKit/UIKit.h>
#import "ViewController.h"

@class ViewController;

@interface view : UIView{
ViewController *viewController;


}
@property (nonatomic,retain)ViewController *viewController;


@end

および .m ファイル:

#import "view.h"
#import "ViewController.h"

@implementation view
@synthesize viewController;

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    NSLog(@"%@",[viewController array]);
}

return self;
}

stackoverflow の他の投稿を確認したところ、値の受け渡しについてはビューコントローラー間でのみ言及されていました。または、配列がappdelegateで宣言され、クラスで使用されました(これは避けたいです)。

上記の最後のコード セグメントの NSLog は null を返します。この配列の値へのアクセスを手伝っていただけませんか。前もって感謝します..!!

4

3 に答える 3

2

ViewControllerでこのコードを使用して実現できます

#import "view.h"

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *ary = [NSArray arrayWithObjects:@"7",@"5",@"3",@"2", nil];

    view *v=[[view alloc] init];
    [v initView:ary];

}

そしてあなたのview.hファイルで:

#import <UIKit/UIKit.h>

@interface view : UIView

-(void)initView:(NSArray *)ary;
@end

そしてあなたの.mファイルで:

#import "view.h"
#import "ViewController.h"

@implementation view

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

-(void)initView:(NSArray *)ary
{
    NSLog(@"%@",ary);
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end

ログ値はこれを表示します:

2013-02-20 20:11:52.731 SampleProject[9414:f803] (
    7,
    5,
    3,
    2
)
于 2013-02-20T14:48:32.713 に答える
1

この行

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

initWithFrame:を設定する前に目的の初期化子を呼び出すview1.viewControllerため、何が起こっているのかということです

NSLog(@"%@",[viewController array]);

実際に呼び出す

NSLog(@"%@",[null array]);

または(疑似コードであることに注意してください)

NSLog(@"%@",null);

あなたがしたいview1.viewControllerことは、割り当てられた後に使用することです。ベスト プラクティスはUIViewController*、パラメーターとして受け取るカスタム コンストラクターを作成し、それを使用することです。

于 2013-02-20T14:39:49.707 に答える
0

最初initに、ビューでメソッドを呼び出し、呼び出されないメソッドでviewControllerをチェックしていinitWithFrameます。initWithFrame:(しかし、デフォルト フレームを使用してメソッド内で from を呼び出している可能性がありinitます。:))。次に、 init メソッドを呼び出したにプロパティ
を設定しているため、メソッド内でまだ初期化されていません。第三に、全体をビューに渡して配列にアクセスする代わりに (これは MVC パターンに反します)、おそらく UIView サブクラスでインスタンス変数を作成し、配列だけを渡すことができます。viewcontrollerviewcontrollerinitWithFrameviewcontroller

次に、できれば配列を設定するためのセッターメソッドを使用して、Dilip の回答に従うことができます。IMO。

于 2013-02-21T06:40:19.380 に答える