2012-01-31 5 views
0

У меня есть метод, который я вызываю из своего основного вида, который задает имя изображения для изображения, которое я хочу отобразить в прокрутке.Как перезагрузить текущий UIView

- (void)loadImage:(NSString *)myImageName 
    { 
     if (myImageName == @"one") { 
      imageName = myImageName; 
     } 
     if (myImageName == @"two") { 
      imageName = myImageName; 
     } 
     if (myImageName == @"three") { 
      imageName = myImageName; 
     } 

     //Reloads view here??? 
    } 

Я загрузке изображений в моем методе viewdidload как так

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    //Create scrollview 
    scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
    scrollView.delegate = self; 
    scrollView.bounces = NO; 

    //Create scrollviewimage 
    if (imageName == @"one") { 
     image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ha.png"]]; 
    } 
    if (imageName == @"two") { 
     image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"haha.png"]]; 
    } 
    if (imageName == @"three") { 
     image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hahaha.png"]]; 
    } 



    containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 550)]; 
    //Add subview 
    [containerView addSubview:image]; 
    //initViews 
    scrollView.contentSize = containerView.frame.size; 
    [scrollView addSubview:containerView]; 

    //scrolling 
    scrollView.minimumZoomScale = 1.0; 
    scrollView.maximumZoomScale = 31.0; 
    [scrollView setZoomScale:scrollView.minimumZoomScale]; 

    //highrachy 
    [self.view addSubview:scrollView]; 

} 

Что происходит, когда я поставил ImageName из parentview от выбора tableviewcell я передаю вниз NSString в LoadImage .. то нагрузка изображение устанавливает имя в viewdidload .. однако то, что происходит, это то, что только первая доза выбора ничего ... поэтому вы всегда увидите первое изображение, которое вы выбираете .. так что если вы выберете изображение два, каждое другое изображение, которое вы выберете, отобразит изображение два ..

a Помощь будет отличной.

здесь является то, что выбор parentview клетка выглядит

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Sets the back button for the new view that loads (this overrides the usual parentview name with "Back") 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil]; 

    if (!self.detailViewController) { 
     self.detailViewController = [[ICDDetailViewController alloc] initWithNibName:@"ICDDetailViewController" bundle:nil]; 

     if (indexPath.section == 0) { 
      _detailViewController.imageName = @"one"; 
      //  NSLog(@"%@", indexPath); 
     } 
     if (indexPath.section == 1) { 
      _detailViewController.imageName = @"two"; 
      //  NSLog(@"%@", indexPath); 
     } 
     if (indexPath.section == 2) { 
      _detailViewController.imageName = @"three"; 
      //  NSLog(@"%@", indexPath); 
     } 
    } 
    [self.navigationController pushViewController:self.detailViewController animated:YES]; 

} 

ответ

3

Не используйте myImageName == @ "three". Существует специальный метод сравнения строк.

попробовать это:

if ([myImageName isEqualToString:@"three"]) { 
    [image setImage:[UIImage imageNamed:myImageName]]; 
} 

Если расширение файла, сделайте следующее:

NSString *imagePath = [NSString stringWithFormat:@"%@.png",myImageName]; 
[image setImage:[UIImage imageNamed:imagePath]]; 

Кстати, вы все еще проводку старого кода, который вы имели в вашем другом вопросе. Вы сохраняете свой detailView в своем первоначальном классе вместо того, чтобы выпускать и создавать новый экземпляр. Выньте инструкции if (! DetailView).

Обновление: единственный другой вариант - взять назначения из большого блока if().

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Sets the back button for the new view that loads (this overrides the usual parentview name with "Back") 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil]; 

    if (!self.detailViewController) { 
     self.detailViewController = [[ICDDetailViewController alloc] initWithNibName:@"ICDDetailViewController" bundle:nil]; 


    //MY CHANGES HERE: 
    //If you left these if() statements inside the original code, they would never 
    //fire if the detailView was already instantiated once. Does this make sense? 
    } // <--- moved the bracket up here 
     if (indexPath.section == 0) { 
      _detailViewController.imageName = @"one"; 
      //  NSLog(@"%@", indexPath); 
     } 
     if (indexPath.section == 1) { 
      _detailViewController.imageName = @"two"; 
      //  NSLog(@"%@", indexPath); 
     } 
     if (indexPath.section == 2) { 
      _detailViewController.imageName = @"three"; 
      //  NSLog(@"%@", indexPath); 
     } 
    //} <--- commented this one out 
    [self.navigationController pushViewController:self.detailViewController animated:YES]; 

} 

Единственный способ заключается в следующем:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Sets the back button for the new view that loads (this overrides the usual parentview name with "Back") 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil]; 
    //commented out the next line, don't need to check to see if it's already present 
    //just create a new instance to push on the stack 
    //if (!self.detailViewController) { 
     self.detailViewController = [[ICDDetailViewController alloc] initWithNibName:@"ICDDetailViewController" bundle:nil]; 

     if (indexPath.section == 0) { 
      _detailViewController.imageName = @"one"; 
      //  NSLog(@"%@", indexPath); 
     } 
     if (indexPath.section == 1) { 
      _detailViewController.imageName = @"two"; 
      //  NSLog(@"%@", indexPath); 
     } 
     if (indexPath.section == 2) { 
      _detailViewController.imageName = @"three"; 
      //  NSLog(@"%@", indexPath); 
     } 
    //} <--- get rid of this bracket since the original if() was commented out 
    [self.navigationController pushViewController:self.detailViewController animated:YES]; 

} 
+0

opps делает это сейчас. –

+0

Это работало? Я уточнил свой ответ для большей ясности. – Justin

1

Это звучит, как вы никогда не отпуская экземпляр UIScrollView. Итак, когда вы снова используете его повторно, viewDidLoad не будет вызван снова. Это означает, что ваша переменная «образ» никогда не переназначает новый образ.

Чтобы проверить, действительно ли это так, попробуйте поместить вызов NSLog в свой метод viewDidLoad и посмотреть, будет ли он вызван во второй раз, который вы выберете из tableViewCell.

Если это так, есть несколько вариантов его фиксации. Вы используете ARC?

+0

Я использую ARC .. –

+0

я просто положить NSLog в каждом случае statments внутри viewdidload и как изображение, единственный, который возвращается в первый который выбирается .. только один раз. –

+1

Отлично, теперь вы знаете, в чем проблема, вам просто нужно это исправить. Я бы рекомендовал прямо установить свойство изображения для вашего класса «image» с помощью [image setImage: [UIImage imageNamed: imageName] в конце вашего метода loadImage :. – AtkinsonCM

0

Вы пробовали только обновить UIImageView?

- (void)loadImage:(NSString *)myImageName 
{ 
    if (myImageName == @"one") { 
     imageName = myImageName; 
    } 
    if (myImageName == @"two") { 
     imageName = myImageName; 
    } 
    if (myImageName == @"three") { 
     imageName = myImageName; 
    } 

    [image setImage:[UIImage imageNamed:imageName]; 
} 
Смежные вопросы