我从另一个视图控制器调用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]只显示空值,我不知道为什么?
答案 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内存)加载到视图。