JLChen
2021-11-29 2e82c7f03b0833e3a149d02453d66d8db133b2ce
HDLSceneSiri/HDLSceneSiri/HDLSiriSceneListViewController.m
@@ -10,9 +10,11 @@
#import <IntentsUI/IntentsUI.h>
#import "HDLRunSceneIntent.h"   //上方“设置Custom Intents”图中右边箭头指的“Class Name”
#import "HDLSiriSceneListCell.h"
#import "HDLSiriSceneModel.h"
#import "HDLSectionHeaderView.h"
#import "HDLSceneSiri.h"
#import "TopBarView.h"
#import "HDLSiriShortcutModel.h"
NSString * const HDLSiriSceneListCellIdentifier  = @"HDLSiriSceneListCellIdentifier";
@@ -37,17 +39,33 @@
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    self.view.backgroundColor = HEXCOLORA(0xF7F7FC,1.0);
    self.view.backgroundColor = HEXCOLORA(0xF2F3F7,1.0);
    [self initView];
    // Do any additional setup after loading the view.
}
/// initView
- (void)initView{
-(void)initLlanguage{
    NSString *languageName = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0];
    // 简体中文
    if ([languageName rangeOfString:@"zh-Hans"].location != NSNotFound) {
    //标题
    if(self.titleName == nil || [self.titleName isEqual:@""]){
        self.titleName = @"Siri快捷指令";
    }
    }else{
        //标题
        if(self.titleName == nil || [self.titleName isEqual:@""]){
            self.titleName = @"Siri Shortcuts";
        }
    }
}
/// initView
- (void)initView{
    [self initLlanguage];
    [self setTopBarViewWithTitle:self.titleName];
    [self initTableView];
    [self refreshSiri];
@@ -64,7 +82,7 @@
//设置标题和返回按钮
- (void)setTopBarViewWithTitle:(NSString *)title{
    [self.view addSubview:self.topBarView];
    self.topBarView.backgroundColor = UIColor.whiteColor;
    self.topBarView.backgroundColor = HEXCOLORA(0xF7F7F7, 1.0);
    self.topBarView.titleLabel.text = title;
}
//返回
@@ -74,8 +92,15 @@
    }
    else {
        [self.navigationController popViewControllerAnimated:YES];
//        [self.navigationController popToRootViewControllerAnimated:YES];
    }
}
#pragma NSMutableArray
- (NSMutableArray *)dataSource {
    if (!_dataSource) {
        _dataSource = [NSMutableArray new];
    }
    return _dataSource;
}
#pragma mark - UITableView
@@ -96,16 +121,59 @@
    return _tableView;
}
- (void)initTableView{
    self.tableView.frame = CGRectMake(0, APP_TOP_BAR_HEIGHT + 12, APP_SCREEN_WIDTH, APP_VISIBLE_HEIGHT - APP_TAB_BOTTOM_HEIGHT-12);
    self.tableView.frame = CGRectMake(0, APP_TOP_BAR_HEIGHT , APP_SCREEN_WIDTH, APP_VISIBLE_HEIGHT - APP_TAB_BOTTOM_HEIGHT);
//    self.tableView.backgroundColor = HEXCOLORA(0xF7F7FC,1.0);
    [self.view addSubview:self.tableView];
    //    [self.tableView reloadData];
    
}
#pragma mark - 让tableView的每个section的headerview随tableview一起滚动
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.tableView)
    {
        CGFloat sectionHeaderHeight = 65.0f;
        if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
            scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
        } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
            scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
        }
    }
}
#pragma mark - UITableViewDataSourceXW
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.dataSource.count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 65.0f;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    HDLSectionHeaderView *view = [[HDLSectionHeaderView alloc]init];
    HDLSiriShortcutModel *model = self.dataSource[section];
    if(model){
        view.titleLabel.text = model.title;
        view.messageLabel.text = model.content;
    }
    return view;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return 8.0f;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
    return [[UIView alloc]init];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    HDLSiriShortcutModel *model = self.dataSource[section];
    if(model && model.list){
        return model.list.count;
    }
    return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
@@ -114,11 +182,11 @@
    if (cell == nil) {
        cell = [[HDLSiriSceneListCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:HDLSiriSceneListCellIdentifier];
    }
    HDLSiriSceneModel *model = self.dataSource[indexPath.row];
    cell.homeId = self.homeId;
    HDLSiriControlModel *model = [self getModelWithNSIndexPath:indexPath];
    if(model){
        if (@available(iOS 12.0, *)) {
            HDLRunSceneIntent *intent = [self getSceneIntent: model.userSceneId];
            HDLRunSceneIntent *intent = [self getSceneIntent: model.controlId];
            [cell initModel:model intent:intent];
        }
    }
@@ -126,18 +194,17 @@
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 72;
    return 50;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    if (@available(iOS 12.0, *)) {
        HDLSiriSceneModel *model = self.dataSource[indexPath.row];
        HDLSiriControlModel *model = [self getModelWithNSIndexPath:indexPath];
        if(model){
            INVoiceShortcut *voiceShortcut = [self getSceneINVoiceShortcut:model.userSceneId];
            INVoiceShortcut *voiceShortcut = [self getSceneINVoiceShortcut:model.controlId];
            [self addOrEditVoiceShortcut:voiceShortcut model:model];
        }
        
@@ -145,11 +212,21 @@
    
}
/// 根据NSIndexPath 获取model
/// @param indexPath indexPath
-(HDLSiriControlModel *)getModelWithNSIndexPath:(NSIndexPath *)indexPath {
    HDLSiriControlModel *model = nil;
    HDLSiriShortcutModel *ssModel = self.dataSource[indexPath.section];
    if(ssModel && ssModel.list && (ssModel.list.count > indexPath.row)){
        model = ssModel.list[indexPath.row];
    }
    return model;
}
/// 添加或者编辑快捷指令
/// @param voiceShortcut 快捷指令
/// @param model 场景
-(void)addOrEditVoiceShortcut:(INVoiceShortcut *)voiceShortcut model:(HDLSiriSceneModel*)model API_AVAILABLE(ios(12.0)){
-(void)addOrEditVoiceShortcut:(INVoiceShortcut *)voiceShortcut model:(HDLSiriControlModel*)model API_AVAILABLE(ios(12.0)){
 
    if(voiceShortcut==nil){
        //1.如果不存在则添加
@@ -173,24 +250,29 @@
}
- (INShortcut *) getINShortcut:(HDLSiriSceneModel*)model API_AVAILABLE(ios(12.0)){
    NSString *title = model.name;
- (INShortcut *) getINShortcut:(HDLSiriControlModel*)sceneModel  API_AVAILABLE(ios(12.0)){
    NSString *title = sceneModel.controlName;
    HDLRunSceneIntent *intent = [[HDLRunSceneIntent alloc] init];
    intent.sceneId = model.userSceneId;
    intent.suggestedInvocationPhrase = title;   //在Siri语音设置时显示的建议设置唤起文字
    intent.sceneName = title;
    intent.controlId = sceneModel.controlId;
    intent.controlName = title;
    intent.homeId = self.homeId;
    intent.controlType = sceneModel.controlType;
    intent.controlJSONStr = sceneModel.controlJSONStr;
    intent.actionName = sceneModel.actionName;
    INShortcut *shortCut = [[INShortcut alloc] initWithIntent:intent];
    return shortCut;
}
/// 根据场景ID或者之前配置过低快捷指令
/// @param sceneId 场景ID
- (HDLRunSceneIntent*)getSceneIntent:(NSString *)sceneId API_AVAILABLE(ios(12.0)){
/// @param controlId 唯一标识ID
- (HDLRunSceneIntent*)getSceneIntent:(NSString *)controlId API_AVAILABLE(ios(12.0)){
    HDLRunSceneIntent *intentFind = nil;
    for (INVoiceShortcut *voiceShortcut in self.siriShortcutList) {
        HDLRunSceneIntent *intent = (HDLRunSceneIntent *)voiceShortcut.shortcut.intent;
        if(intent){
            if([intent.sceneId isEqualToString:sceneId]){
            if([intent.controlId isEqualToString:controlId]){
                intentFind = intent;
                break;
            }
@@ -200,13 +282,13 @@
}
/// 根据场景ID或者之前配置过低快捷指令
/// @param sceneId 场景ID
- (INVoiceShortcut*)getSceneINVoiceShortcut:(NSString *)sceneId API_AVAILABLE(ios(12.0)){
/// @param controlId 唯一标识ID
- (INVoiceShortcut*)getSceneINVoiceShortcut:(NSString *)controlId API_AVAILABLE(ios(12.0)){
    INVoiceShortcut *voiceShortcutFind = nil;
    for (INVoiceShortcut *voiceShortcut in self.siriShortcutList) {
        HDLRunSceneIntent *intent = (HDLRunSceneIntent *)voiceShortcut.shortcut.intent;
        if(intent){
            if([intent.sceneId isEqualToString:sceneId]){
            if([intent.controlId isEqualToString:controlId]){
                voiceShortcutFind = voiceShortcut;
                break;
            }