2015-11-18 2 views
0

Я знаю, что это было тривиально, но я перепутал себя и провел много часов.UIViewController в настраиваемом UITableViewCell

У меня есть UIViewController, который состоит из CategoryTableview и ProductsTableView.

The ProductsTableView создает настраиваемый TableViewCell под названием ProductTableViewCell.

ProductTableViewCell имеет ярлык заголовка, метку продукта, метку цен и настраиваемый степпер для управления количеством продуктов, которые являются подклассами из UIViewController.

Шагомер состоит из двух кнопок и текстового поля.

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

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

Код:

ProductionViewController.h (parent view controller for listing everything) 

@interface ProductionViewController()<UITableViewDataSource, UITableViewDelegate> 
@property (nonatomic,strong) UITableView* categoryTable; 
@property (nonatomic,strong) UITableView* productsTable; 

@property (nonatomic,strong) CheckOutBar* checkOutBar; 

//datasources 
@property (nonatomic,strong) NSMutableArray* menuLists; 
@property (nonatomic,strong) NSMutableArray* detailLists; 

//datefield 
@property (nonatomic,strong) NSString* startDate; 
@property (nonatomic,strong) NSString* endDate; 

настроенный ячейка для продуктов

@interface ProductCell : UITableViewCell 

@property (nonatomic, strong) UIImageView* eqiupmentImage; 
@property (nonatomic, strong) UILabel* Title; 
@property (nonatomic, strong) UILabel* details; 
@property (nonatomic, strong) UILabel* prices; 
@property (nonatomic, strong) MCStepperViewController* stepper; 

Способ реализации ячейки является

 @implementation ProductCell 

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    { 
     _Title = [[UILabel alloc] init]; 
     _eqiupmentImage = [[UIImageView alloc] init]; 
     _details = [[UILabel alloc] init]; 
     _details.font = kFONT(12); 
     _details.textColor = KColor_Gray; 

     _prices = [[UILabel alloc] init]; 
     _stepper = [[MCStepperViewController alloc] init]; 
     [self.contentView addSubview:_stepper.view]; 
     [self.contentView addSubview:_Title]; 
     [self.contentView addSubview:_eqiupmentImage]; 
     [self.contentView addSubview:_details]; 
     [self.contentView addSubview:_prices]; 
    } 
     return self; 
    } 

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    [_eqiupmentImage setFrame:CGRectMake(kLeftMargin, kLeftMargin, 80 ,80)]; 
    [_Title setFrame:CGRectMake(10+CGRectGetMaxX(_eqiupmentImage.frame), kLeftMargin/2, 60, 20)]; 
    [_details setFrame:CGRectOffset(_Title.frame, 0, 20)]; 
    [_prices setFrame:CGRectMake(10+CGRectGetMaxX(_eqiupmentImage.frame), CGRectGetMaxY(_eqiupmentImage.frame)-20, 40, 20)]; 
    [_stepper.view setFrame:CGRectOffset(_prices.frame, 40, 0)]; 
} 

Настроенный stepperview является

MCStepperViewController.h (for controlling the amount of products) 
@interface MCStepperViewController : UIViewController 

@property (nonatomic, strong) UITextField *amountText; 
@property (nonatomic, strong) UIButton * plusButton; 
@property (nonatomic, strong) UIButton * minusButton; 

@property (nonatomic, assign) int max; 
@property (nonatomic, assign) int min; 

@property (nonatomic, assign) int amount; 

Спасибо

+0

Исследуйте концепцию наблюдения ключевых значений (KVO). Вы можете наблюдать значение переменной «сумма» в родительском контроллере представления. Каждый раз, когда значение изменяется, родитель получает уведомление, и вы можете назначить метод для вызова. – TheAppMentor

+0

@ TheAppMentor Спасибо, потому что значение, которое я хочу наблюдать, является одним из свойств шагового контроллера, а шагомер является свойством ячейки. Я не уверен, что могу напрямую наблюдать за значением в основном родительском контроллере, или я должен добавить наблюдателя в настраиваемую ячейку? – Mix

+0

@Mix Вы хотите получать уведомления каждый раз, когда изменение ценности? Или вы просто хотите проверить текущее значение для суммарной логики? – ibnetariq

ответ

0

Одним из способов может быть реализация протокола в клетках с методом, как - (void)productCell:(ProductCell *)cell didChangeStepperValue:(NSInteger)stepperValue. Затем вы делаете свой контроллер просмотра делегатом каждой ячейки и вызываете этот метод каждый раз, когда шагомер меняет его значение. Чтобы отделить ячейки друг от друга, вы можете присвоить их значение tag соответствующему индексу вашей модели.

Другой способ - использовать KVO, но вы должны быть осторожны с подпиской/отменой подписки. И использование блоков, конечно же, является жизнеспособным вариантом.

+0

Спасибо, я внедрил делегат в классе ячеек, но я не могу вызвать шаговый контроллер для выполнения метода делегата, потому что в шаге не существует свойства ячеек, но свойство stepper находится в классе ячеек – Mix

+0

Почему бы не реализовать другой протокол в ваш шаговый класс и реализовать соответствующий метод (например, '- (void) stepperController: (MCStepperViewController *) stepperController valueChanged: (NSInteger) значение;') в вашей ячейке? Да, это становится довольно сложным, но структура довольно ясна.Кроме того, вы можете повторно использовать этот элемент управления в другом месте без какой-либо связи. –

+0

Сделано! Большое спасибо. И заставьте меня лучше узнать делегата. – Mix