iPhone / Objective-c - получить доступ к предыдущему ViewController из подпредставления? - PullRequest
0 голосов
/ 11 июля 2011

Как получить доступ к предыдущему контроллеру представления в подпредставлении? Потому что я могу выполнять действия, но не могу использовать self.[my main view controller].

Это мой код, для тестирования:

PhotoViewController.m

-(IBAction)likeButton:(UIButton *)sender
{
    //this part works
    NSString *num = @"2";
    self.label.text = [NSString stringWithFormat:@"%@ + %@",
                                                 self.label.text,
                                                 num];

    //this part doesn't work
    //switch over to the third view to see if it worked
    self.tabBarController.selectedIndex = 0;
}

У меня есть UITabBarController, а у одного из контроллеров вида - UIScrollView. Внутри UIScrollView находится PhotoViewController объект.

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Override point for customization after application launch
    MyTabBarViewController *vc2 = [[MyTabBarViewController alloc] init];
    SecondViewController *vc3 = [[SecondViewController alloc] init];
    controller = [[DemoAppViewController alloc] init];
    controller.view.frame = CGRectMake(0, 20, 320, 460);

    controller.title = @"Intro Screen";
    vc2.title = @"Explore";
    vc3.title = @"Send a Pic";
    UITabBarController *tbc = [[UITabBarController alloc] init];
    tbc.viewControllers = [NSArray arrayWithObjects:controller, vc2, vc3, nil];
    [controller release];
    [vc2 release];
    [vc3 release];

    [self.window addSubview:tbc.view];
    [self.window makeKeyAndVisible];

  return YES;

}

Кроме того, мой TabBarViewController.m // не мой настоящий UITabBarController, хотя формулировка сбивает с толку

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    arrayCount = [array count];
    scroller.delegate=self;
    scroller.pagingEnabled=YES;
    scroller.directionalLockEnabled=YES;
    scroller.showsHorizontalScrollIndicator=NO;
    scroller.showsVerticalScrollIndicator=NO;

    //should have an array of photo objects and the number of objects, correct?
    scrollWidth = 0;
    scroller.contentSize=CGSizeMake(arrayCount*scroller.frame.size.width, scroller.frame.size.height);

    for (int i = 0; i < arrayCount;i++) {
        PhotoViewController *pvc = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];        
        UIImageView *scrollImageView = [[UIImageView alloc] initWithFrame:CGRectOffset(scroller.bounds, scrollWidth, 0)];
        CGRect rect = scrollImageView.frame;
        pvc.view.frame  = rect;
        pvc.label.textColor = [UIColor whiteColor];
        id individualPhoto = [array objectAtIndex:i];
        NSLog(@"%@",individualPhoto);
        NSArray *keys=[individualPhoto allKeys];
        NSLog(@"%@",keys);
        NSString *imageURL=[individualPhoto objectForKey:@"source"];
        NSURL *url = [NSURL URLWithString:imageURL];
        NSData  *data = [NSData dataWithContentsOfURL:url];
        pvc.imageView.image = [[UIImage alloc] initWithData:data];
        pvc.label.text = [individualPhoto objectForKey:@"id"];
        [scroller addSubview:pvc.view];
        [scrollImageView release];
        //[pvc release];
        scrollWidth += scroller.frame.size.width;
    }

    if (arrayCount > 3) {
        pageControl.numberOfPages=3;
    } else {
    pageControl.numberOfPages=arrayCount;
    }
    pageControl.currentPage=0;
}

Ответы [ 4 ]

3 голосов
/ 11 июля 2011

Если подклассу UIView нужно сообщить контроллеру над собой, общий (и часто рекомендуемый?) Способ сделать это состоит в том, чтобы подкласс представления реализовал протокол делегата (слабая связанная переменная экземпляра, указывающая на контроллер представления, который вы хочу использовать). Контроллер представления должен затем установить себя в качестве делегата представления, когда это представление инициализируется.

2 голосов
/ 11 июля 2011

Попробуйте определить этот метод в вашем PhotoViewController:

+ (YOURTABBARCONTROLLER*)parentTabBarController:(UIResponder*)view {
    id nextResponder = nil;
    id v = view;
    while (nextResponder = [v nextResponder]) {
               NSLog(@"Found Responder: %@", nextResponder); //-- ADDED THIS
       if ([nextResponder isKindOfClass:[YOURTABBARCONTROLLER class]])
          return nextResponder;
        v = nextResponder;
    }
    return nil;
 }

, он пройдет через цепочку респондента и вернет первый найденный контроллер данного типа.Замените YOURTABBARCONTROLLER фактическим классом контроллера панели вкладок, и вы должны иметь возможность:

-(IBAction)likeButton:(UIButton *)sender
{
    //this part works
    NSString *num = @"2";
    self.label.text = [NSString stringWithFormat:@"%@ + %@",
                                             self.label.text,
                                             num];

    [PhotoViewController parentTabBarController:self.view].selectedIndex = 0;
    // self.tabBarController.selectedIndex = 0;
}

Обновлено

-(IBAction)likeCommentButton:(UIButton *)sender
{
    //code goes here
    TypeSomethingViewController *typeSomethingViewController = [[TypeSomethingViewController alloc] init];
    typeSomethingViewController.delegate = self;

    [self presentModalViewController:typeSomethingViewController animated:YES];
    [typeSomethingViewController release];
}

-(void)typeSomethingViewController:(TypeSomethingViewController *)controller didTypeSomething:(NSString *)text
{
    //NSLog(@"response: %@", controller);

    NSString *commentID = self.label.text;
    for(UIViewController *controller in [PhotoViewController parentTabBarController:self.parentViewController.view].viewControllers)
    {
        if([controller isKindOfClass:[DemoAppViewController class]])
        {
            DemoAppViewController *davc = (DemoAppViewController *)controller;
            //[davc commentPicture:commentID :message];
            [davc likePicture:commentID];
        }
    }
    [PhotoViewController parentTabBarController:self.view].selectedIndex = 0;

    [self dismissModalViewControllerAnimated:YES];    
}
0 голосов
/ 11 июля 2011

tabBarController должно быть свойством делегата приложения.

Попробуйте получить к нему доступ с помощью:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication]
                                               delegate];
appDelegate.tabBarController.selectedIndex = 0;

Если вы не объявите то же свойство в PhotoViewController, вы выиграли 'получить к нему доступ таким образом.

Попробуйте импортировать заголовок делегата приложения в PhotoViewController.h примерно так:

#import "MyAppDelegate"

, затем попробуйте этот код выше, заменив tabBarController на tbcкоторое, как показывает пример, является именем, данным этому свойству.

0 голосов
/ 11 июля 2011

Попробуйте это переключиться на первый контроллер.

self.tabBarController.selectedViewController 
= [self.tabBarController.viewControllers objectAtIndex:0];

Измените значение индекса, чтобы переключиться на тот контроллер, на который вы хотите переключиться.

...