另一个UIViewController中的UIViewController的新实例:为什么我不能设置实例变量?

所以我有一个名为MyTabBarViewController的UIViewController子类,它有一个UIScrollView。 在MyTabBarViewController内部我正在创建另一个名为PhotoViewController的UIViewController子类的实例。 (注意:我这样做,所以我可以使用IB设置IBOutlets)

我正在尝试从我的TabBarViewController设置每个PhotoViewController实例的标签。 我使用每个PhotoViewController的nib初始化,所以我的印象是每个PhotoViewController实例都连接到它们各自的IBOutlets – 允许我使用pvc.label.text = @“我想要的文本”简单地设置标签名称。

你能解释一下我的逻辑错误吗? 因为它不起作用而且不确定该怎么做。 : – /

MyTabBarViewController.m

#import "MyTabBarViewController.h" @implementation MyTabBarViewController @synthesize pageControl,scroller; -(IBAction)clickPageControl:(id)sender { int page=pageControl.currentPage; CGRect frame=scroller.frame; frame.origin.x = frame.size.width * page; frame.origin.y = 0; [scroller scrollRectToVisible:frame animated:YES]; } -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { int page = scrollView.contentOffset.x/scrollView.frame.size.width; pageControl.currentPage=page; } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)dealloc { [super dealloc]; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; scroller.delegate=self; scroller.pagingEnabled=YES; scroller.directionalLockEnabled=YES; scroller.showsHorizontalScrollIndicator=NO; scroller.showsVerticalScrollIndicator=NO; scroller.contentSize=CGSizeMake(pageControl.numberOfPages*scroller.frame.size.width, scroller.frame.size.height); CGFloat scrollWidth = 0; int pageNumber = 0; for (int i=0; i<3; i++) { PhotoViewController *pvc = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil]; CGRect rect = scroller.frame; rect.size.height = scroller.frame.size.height; rect.size.width = scroller.frame.size.width; rect.origin.x = scroller.frame.origin.x + scrollWidth; rect.origin.y = scroller.frame.origin.y; pvc.label.text = [NSString stringWithFormat:@"%d", pageNumber]; pvc.label.textColor = [UIColor redColor]; pvc.view.frame = rect; [scroller addSubview:pvc.view]; [pvc release]; pageNumber++; scrollWidth += scroller.frame.size.width; } pageControl.numberOfPages=3; pageControl.currentPage=0; [self.view addSubview:scroller]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } @end 

PhotoViewController.h非常简单。 而PhotoViewController.m也是如此,但是我已经将问题包含在实例中。

PhotoViewController.m

 #import "PhotoViewController.h" @implementation PhotoViewController @synthesize label, imageView, sendButton, cancelButton; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)dealloc { [super dealloc]; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } @end 

你不能设置这样的任何视图相关值(制作对象和从该视图设置其他enteries)。

因为你不能在任何视图控制器的viewDidLoad之前设置任何级别的值。你需要什么,你需要相应地为标签设置字符串类型的属性,然后在MyTabBarViewController中设置它们的值然后从堆栈中拾取PhotoViewController中MyTabBarViewController类的对象然后访问它的属性并设置标签。

要从堆栈中选择视图对象,您需要使用此行

 MyTabBarViewController *obj = (MyTabBarViewController *)[self.navigationController.viewControllers objectAtIndex: [self.navigationController.viewControllers count]-2]; 

IBOutlet实体在viewDidLoad之前不存在,并且通常在您启动节目之前不会发生。 因此,在MyTabBarViewController中,您正在寻找一个不存在的标签等。 (当然,Objective-C方便地忽略了对nil指针的调用,所以看起来就像它一样有效 – 只是没有任何反应。)

根据规范,您可以通过引用视图控制器的视图属性来触发加载,但我从未尝试过。