2015-02-13 3 views
1

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

У меня есть один интерфейс часов, который содержит таблицу с несколькими рядами одного контроллера строк, каждая из которых содержит две кнопки. Методы действий для кнопок содержатся в соответствующем классе контроллера строк. Фоновое изображение кнопки изменяется при каждом нажатии. Это все работает. Тем не менее, мне также нужно вызвать функцию в контроллере интерфейса и изменить некоторые переменные, которые существуют в интерфейсном контроллере, каждый раз при нажатии кнопки.

Возможно ли это? Я также понимаю, что я не могу вызвать didSelectRowAtIndex одновременно с действием кнопки.

Спасибо!

ответ

1

Вам необходимо подключить свой интерфейсный контроллер к вашим кнопкам, а затем вызвать соответствующий метод. Лучше отделить его от делегата или с помощью селектора, но при необходимости вы можете просто пройти через свой интерфейсный контроллер.

Предполагается, что вы подключили свой объект WKInterfaceTable к таблице свойств в вашем интерфейсном контроллере.

//In your interface controller 
- (void)loadTableData 
{ 
    NSInteger numRows = <CALC_NUM_ROWS>; 

    [self.table setNumberOfRows:num withRowType:@"<MY_ROW_TYPE>"]; 

    for (int i = 0; i < num; i++) 
    { 
     MyRowController *row = [self.table rowControllerAtIndex:i]; 

     //Here is where you want to wire your interface controller to your row 
     //You will need to add this method to your row class 
     [row addSelectionTarget:self action:@selector(myMethodToCall)]; 

    } 
} 

- (void) myMethodToCall 
{ 
    //Do something in your interface controller when a button is selection 
} 


//Now in your MyRowController 
-(void)addSelectionTarget:(id)target action:(SEL)action 
{ 
    //You will need to add properties for these. 
    self.selectionTarget = target; 
    self.selectionAction = action; 
} 

//Call this when you want to call back to your interface controller 
- (void)fireSelectionAction 
{ 
    [self.selectionTarget performSelector:self.selectionAction]; 

    //Or to do it without warnings on ARC 
    IMP imp = [self.selectionTarget methodForSelector:self.selectionAction]; 
    void (*func)(id, SEL) = (void *)imp; 
    func(self.selectionTarget, self.selectionAction); 

} 
+0

спасибо за подробный ответ. Я довольно новичок в iOS dev, и я работал только с Swift. Любые подсказки о том, как перевести это в Свифт, будут очень признательны! – Papaya4APPLE

+0

Как вы знаете кнопку, которая была использована в строке? Индекс строки не передается; и нет тега, связанного с элементом управления. – Daniel

0

В контроллере интерфейса (не контроллер строки, он должен быть подклассом WKInterfaceController), реализовать следующий метод:

- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex 
{ 
    NSLog(@"You tapped the row at index %d", rowIndex); 
} 
Смежные вопросы