WKInterfaceTable, WKInterfaceButton и методы действий

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

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

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

Спасибо!


person Papaya4APPLE    schedule 13.02.2015    source источник


Ответы (2)


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

Это предполагает, что вы подключили свой объект 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);

}
person Stephen Johnson    schedule 13.02.2015
comment
Большое спасибо за подробный ответ. Я новичок в разработке iOS и работал только со Swift. Мы будем очень признательны за любые подсказки о том, как перевести это на Swift! - person Papaya4APPLE; 14.02.2015
comment
Как узнать, какая кнопка была нажата в строке? Индекс строки не передается; и нет тега, связанного с элементом управления. - person Daniel; 18.05.2015

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

- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex
{
    NSLog(@"You tapped the row at index %d", rowIndex);
}
person jrc    schedule 13.08.2015