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

时间:2011-06-27 04:06:02

标签: iphone ios uiviewcontroller instance-variables

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

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

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

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.
    // e.g. 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.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

2 个答案:

答案 0 :(得分:2)

您无法设置任何与此相关的视图值(制作对象并从该视图中设置其他输入)。

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

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

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

答案 1 :(得分:1)

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

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