Номер страницы в постраничном интерфейсе с WatchKit (Watch)?

Я создал приложение WatchKit с Страничный интерфейс.

Есть 3 страницы, и каждая из них связана с моим классом InterfaceController.swift (который расширяет WKInterfaceController).

Мой вопрос: внутри InterfaceController.swift, как я могу определить номер страницы текущего представления?


person Luca Angeletti    schedule 20.12.2014    source источник


Ответы (2)


Если вы используете

func presentControllerWithNames(_ names: [AnyObject],
                   contexts contexts: [AnyObject]?)

Вам просто нужно передать номер страницы в контексте, чтобы вы могли сохранить его и получить позже. Это не раскадровка.

Если вы используете раскадровку, это то же самое, вам просто нужно использовать другой метод.

func contextsForSegueWithIdentifier(_:inTable:rowIndex:)

И передайте индекс своей страницы в контексте каждого контроллера

person Mehdi.Sqalli    schedule 20.12.2014
comment
Спасибо за ваш ответ. Я использую раскадровку, и я сделал и переопределил contextsForSegueWithIdentifier(segueIdentifier: String) -> [AnyObject]? и contextForSegueWithIdentifier(segueIdentifier: String, inTable table: WKInterfaceTable, rowIndex: Int) -> AnyObject? в моем InterfaceController.swift. Но этот метод не вызывается, когда я меняю страницу в Симуляторе. - person Luca Angeletti; 22.12.2014
comment
Вам нужно сделать модальный Segue. PageController должен быть модальным. Ты сделал это ? - person Mehdi.Sqalli; 22.12.2014
comment
Да, я сделал это через Interface Builder. - person Luca Angeletti; 12.01.2015

Это может быть достигнуто таким образом,

Представить InterfaceController в pageNavigation с соответствующими значениями контекста,

[self presentControllerWithNames:@[@"TestInterfaceController",@"TestInterfaceController",@"TestInterfaceController"] contexts:@[@"Page 1",@"Page 2",@"Page 3"]];

Затем создайте свойство NSString для отслеживания страницы и метки для ее отображения,

@property (nonatomic, strong) NSString *currentContext;
@property (weak, nonatomic) IBOutlet WKInterfaceLabel *pageLabel;

В awakeWithContext назначьте его свойству NSString,

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    NSLog(@"%@",context);
    self.currentContext = context;
}

Отобразите его на willActive,

- (void)willActivate {
    // This method is called when watch view controller is about to be visible to user
    [super willActivate];

    NSLog(@"%@ willActivate",self.currentContext);
    [self.pageLabel setText:self.currentContext];
}

Вы также можете определить, когда страница деактивировалась,

- (void)didDeactivate {
    // This method is called when watch view controller is no longer visible
    [super didDeactivate];
    NSLog(@"%@ didDeactivate",self.currentContext);
}

Редактировать: если навигация по страницам настроена с использованием перехода на раскадровку, переопределите этот метод в исходном IntefaceController, из которого вы создали переход модели в контроллер назначения, чтобы предоставить контексты,

- (NSArray *)contextsForSegueWithIdentifier:(NSString *)segueIdentifier {
    NSArray *contexts = nil;
    if ([segueIdentifier isEqualToString:@"MyPageNavigation"]) {
        contexts = @[@"Page 1",@"Page 2",@"Page 3"];
    }

    return contexts;
}
person Dhaval Panchal    schedule 22.05.2015
comment
Спасибо. Последние 4 блока кода входят в класс InterfaceController. Но где я должен поместить инструкцию в вашем первом блоке кода? - person Luca Angeletti; 22.05.2015
comment
Вам нужно поместить это в контроллер Source InterfaceController, откуда вы представляете свой целевой TestInterfaceController. Может быть любое действие кнопки в зависимости от вашей реализации. - person Dhaval Panchal; 22.05.2015
comment
Обратите внимание, что пользовательский интерфейс полностью управляется с помощью постраничной раскадровки. Есть 3 InterfaceController(а), и они связаны отношением следующей страницы. Я не загружаю следующий интерфейсный контроллер через код. - person Luca Angeletti; 22.05.2015