1

別のView ControllerからNSArrayを呼び出すときに問題が発生しました。解決策は簡単かもしれませんが、初心者として混乱しています。

ここに私の問題があります、

firstViewController から SecondViewController に配列を送信しようとしていますが、SecondViewController にある UILabel の配列値を更新する必要があります。

secondViewController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  andStationName:(NSArray *)stationName;
// stationName is from firstViewController
    {

// now the stationName have the array values


   NSArray *stationNames=[[stationName mutableCopy]retain];

 //take a copy to stationNames

 }

この値を UILabel に更新する必要があります

-(void)viewWillAppear:(BOOL)animated
 {
//stationNameDisplay is a uilabel

 stationNameDisplay.text=[stationNames objectAtIndex:0];
  NSLog(@"station name %@",[stationNames objectAtIndex:0]);

 }

しかし、[stationNames objectAtIndex:0] には null 値しか表示されません。理由がわかりません。

4

4 に答える 4

2

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilメソッドまたは aを介して値を送信しようとしないでくださいviewDidLoad。タブバーでは、ユーザーはビューをアンロードしたり、View Controller を再初期化したりせずにビューを切り替えるためです。

appdelegate.h次のようにアプリケーションで変数を宣言します。

@interface AppDelegate : NSObject{
 NSMutableArray *stationnamespassed;
}
@property (nonatomic, retain) NSMutableArray *stationnamespassed;
@end

appdelegate.m

@implementation AppDelegate
@synthesize stationnamespassed;

 -(void) dealloc{
          [stationnamespassed release];
          [super release];
         }
@end

これfirstviewcontroller.hを宣言する

@interface firstviewcontroller {
  NSMutableArray *stationnamestobepassed;
}
@property (nonatomic, retain) NSMutableArray *stationnamestobepassed;
@end

これfirstviewcontroller.mを宣言する

@implementation firstviewcontroller
@synthesize stationnamestobepassed;

-(void) someaction{
   stationnamestobepassed = [NSMutableArray     
     arrayWithObjects:@"string1",@"string2",@"string3"];
    AppDelegate *appDelegate=[[UIApplication sharedApplicaton] delegate];
    appDelegate.stationnamespassed = self.stationnamestobepassed;
}

-(void) dealloc{
  [stationnamestobepassed release];
  [super release];
 }
@end

secondviewcontroller.mのようにアプリデリゲート変数にアクセスします

@implementation secondviewcontroller

   -(void)viewWillAppear:(BOOL)animated
 {
//stationNameDisplay is a uilabel
AppDelegate *appDelegate=[[UIApplication sharedApplicaton] delegate];
 stationNameDisplay.text=[appDelegate.stationnamespassed objectAtIndex:0];
  NSLog(@"station name %@",[appDelegate.stationnamespassed objectAtIndex:0]);

 }
-(void) dealloc{
      [super release];
     }
@end

この方法を試してください。さまざまなビュー コントローラー間でデータを永続化するさまざまな方法の詳細については、この記事をお読みください。

于 2012-05-18T10:08:34.453 に答える
1

まず、initコンストラクターから取得しているNSArrayのスコープが間違っています。stationNames配列のプロパティを作成し、次のように設定する必要があります。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNibNil andStationName:(NSArray *)stationName;
// stationName is from firstViewController
 {   
     self.stationNames = stationName;
 }

その後、次のようにアクセスできます。

 stationNameDisplay.text = [self.stationNames objectAtIndex:0];
 NSLog(@"station name %@",[self.stationNames objectAtIndex:0]);
于 2012-05-18T10:08:55.770 に答える
0

firstViewController.m

-(void)someMethod
{

    NSArray *stationName=[[NSArray alloc ]initWithObjects:@"One",@"Two",@"Three", nil];
    secongViewController *sView=[[secongViewController alloc]initWithNibName:@"secongViewController" bundle:nil];
    sView.stationNames=[[[NSArray alloc]initWithArray:stationName]autorelease];

    [self.view addSubview:sView.view];
}

@interface secongViewController : UIViewController {

    NSArray *stationNames;
}

@property(nonatomic,retain) NSArray *stationNames;
@end


@interface secongViewController : UIViewController {

    NSArray *stationNames;

    UILabel *labe;

}

@property(nonatomic,retain) IBOutlet UILabel *labe;
@property(nonatomic,retain) NSArray *stationNames;
@end

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"station name %@",[stationNames objectAtIndex:0]);
    [labe setText:[stationNames objectAtIndex:0]];

}

viewWillAppear: 内のラベル テキストを更新しようとすると、ビューにロードされた時点で viewDidLoad IBOutlet(UIController メモリ) が読み込まれるため、更新されません。

于 2012-05-18T11:03:53.487 に答える
0

NSArrayにはそれらの参照のみが含まれ、mutableCopyはコピーされたNSArrayにそれらを自動的に保持しないため、配列stationNameの各要素を保持する必要があると思います。

于 2012-05-18T10:04:21.737 に答える