在另一个视图控制器的viewWillApper方法中使用时,来自一个视图控制器的NSArray变为NULL?

时间:2012-05-18 09:41:48

标签: null nsarray viewwillappear

我从另一个视图控制器调用NSArray时遇到问题,解决方案可能很简单但作为初学者我很困惑。

这是我的问题,

我试着从我的firstViewController发送一个数组到SecondViewController,我需要将数组值更新到我的UILabel,它位于SecondViewController上。

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]只显示空值,我不知道为什么?

4 个答案:

答案 0 :(得分:2)

请勿尝试通过- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil方法或viewDidLoad发送值,因为在标签栏中,用户将在视图之间切换,而无需卸载视图或重新初始化视图控制器。

在Application 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访问app委托变量中,如下所示

@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

请尝试这种方式。有关在不同视图控制器之间保存数据的不同方法的详细信息,请阅读this文章。

答案 1 :(得分: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]);

答案 2 :(得分:0)

我猜你需要保留数组stationName中的每个元素,因为NSArray只包含它们的引用,而mutableCopy不会在复制的NSArray中自动保留它们。

答案 3 :(得分: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内存)加载到视图。