2014-10-24 2 views
0

Я хочу изменить значение UILabel, когда кто-то на него нажимает.Доступ к общедоступной переменной в подклассе uitableviewcell

Значения, к которым я хочу изменить его, определены в самом ViewController.

Сейчас я работаю с этим кодом:

- (void)tapOnBalance { 
    TimelineViewController *timelineVC = [[TimelineViewController alloc]init]; 
    if(timelineVC.oldBalance && timelineVC.newBalance){ 
    NSTimeInterval duration = 0.5f; 
    [UIView transitionWithView:self.amountLabel 
        duration:duration 
        options:UIViewAnimationOptionTransitionCrossDissolve 
        animations:^{ 
        self.amountLabel.text = timelineVC.newBalance;  
        } completion:^(BOOL finished){ 

        [UIView animateWithDuration:duration delay:duration options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
         self.amountLabel.text = timelineVC.oldBalance; 
        } completion:^(BOOL finished){ 
         NSLog(@"finished"); 
        }]; 
    }]; 
    } 
} 

Однако, потому что я, вероятно, инициализацией TimelineViewController как новый insance, все начальные значения равны нулю, поэтому кодоблок внутри if/else утверждение никогда не запускается.

Как получить доступ к этим общедоступным значениям без создания нового экземпляра TimelineViewController?

+0

Действительно плохая идея. Ячейка не должна знать никаких контроллеров. Класс вашей ячейки должен определять протокол и иметь свойство делегата. Тогда ваш контроллер просмотра может быть делегатом ячейки. Затем ячейка может попросить своего делегата предоставить обновленное значение, когда это необходимо. Это позволяет вашей ячейке работать без каких-либо конкретных знаний о том, откуда она получает свои данные. – rmaddy

+0

@rmaddy кажется законным, но для этой же задачи гораздо больше работы. Какое зло я могу вызвать, когда я это делаю? – bdv

+0

Слишком много сцепления. Ваша ячейка требует слишком много знаний о конкретном контроллере представления и, что еще хуже, о том, как настроены данные. Что произойдет, если вам понадобится одна и та же ячейка таблицы во втором контроллере представления? Несомненно, теперь быстро и просто, чтобы ячейка напрямую обращалась к данным с определенного контроллера представлений, но в долгосрочной перспективе вы пожалеете об этом. Ваш код потребует больше работы позже, когда все изменится. Плюс, он идет полностью против хорошего дизайна MVC. – rmaddy

ответ

0

Вы правы, вы создаете новый экземпляр TimelineViewController каждый раз, когда вызывается tapOnBalance.

Я не уверен, как ваша архитектура подобна, но решение, которое приходит на ум, чтобы создать свойство для TimelineViewController внутри контроллера представления, который реализует tapOnBalance:

@property (nonatomic, strong) TimelineViewController *timelineVC; 

в вашем заголовке файла или частный интерфейс. Затем инициализируйте это один раз внутри viewDidLoad и получите к нему доступ self.timelineVC.

+0

Как-то он не обновляет newBalance и oldBalance после инициализации TimelineViewController – bdv

+0

Где и как вы их устанавливаете? – Cornelius

Смежные вопросы