1

我从另一个视图控制器调用 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] 只显示空值,我不知道为什么?

4

4 回答 4

2

不要尝试通过- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilmethod 或 a发送值,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访问应用程序委托变量如下

@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

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

于 2012-05-18T10:04:21.737 回答
0

第一视图控制器.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 memory) 已加载到视图。

于 2012-05-18T11:03:53.487 回答