Как перезагрузить текущий UIView - PullRequest
0 голосов
/ 01 февраля 2012

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

 - (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];

}

Что происходит, когда я устанавливаю имя изображения из родительского представления из выбора ячеек таблицы, я передаю строку nsstring в loadImage ... затем загружаемое изображение задает имя в viewdidload ... однако происходит то, что только первый выбор получает что-нибудь ... таким образом, вы всегда будете видеть первое выбранное вами изображение. поэтому, если вы выберете второе изображение, каждое другое выбранное изображение будет показывать второе изображение.

любая помощь будет отличной.

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

- (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 ]

3 голосов
/ 01 февраля 2012

Не используйте 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];

}
1 голос
/ 01 февраля 2012

Похоже, вы никогда не выпускаете свой экземпляр UIScrollView.Поэтому, когда вы собираетесь использовать его повторно во второй раз, viewDidLoad больше не вызывается.Это означает, что вашей переменной 'image' никогда не назначается новое изображение.

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

В этом случае существует несколько вариантов исправления.Вы используете ARC?

0 голосов
/ 01 февраля 2012

Вы пробовали просто обновить 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...