Ver Fonte

新增客服入口

Steven há 11 meses atrás
pai
commit
4b0b973ab6

+ 9 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -1526,5 +1526,14 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param faliure 失败
 + (void)sysExceptionLogUpdate:(NSString *)post token:(NSString *)access_token logArray:(NSMutableArray *)logArray success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
+
+// 客服相关
+// GET /api-teacher/teacher/updateUserCustomerService
+
+/// 查询客服ID
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)updateUserCustomerServiceRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 @end
 NS_ASSUME_NONNULL_END

+ 13 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m

@@ -2800,4 +2800,17 @@
     [self request:post andWithUrl:url and:logArray success:success faliure:faliure];
 }
 
+// 客服相关
+// GET /api-teacher/teacher/updateUserCustomerService
+
+/// 查询客服ID
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)updateUserCustomerServiceRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/teacher/updateUserCustomerService"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+
 @end

+ 0 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Base/LoginManger/KSLoginManager.m

@@ -102,7 +102,6 @@
         }
         else {
             [ctrl popToRootViewControllerAnimated:NO];
-            [ctrl popToRootViewControllerAnimated:NO];
             LoginViewController *logonVC = [[LoginViewController alloc] init];
             CustomNavViewController *navCtrl = [[CustomNavViewController alloc] initWithRootViewController:logonVC];
             [AppDelegate shareAppDelegate].window.rootViewController = navCtrl;

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserInfo.h

@@ -88,6 +88,10 @@
 
 @property (nonatomic, assign) BOOL customerService;
 
+@property (nonatomic, assign) NSInteger customerServiceNum; // 客服数量
+@property (nonatomic, strong) NSString *imCustomerId; // 客服ID
+
+
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;
 - (NSDictionary *)dictionaryRepresentation;

+ 17 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserInfo.m

@@ -82,6 +82,9 @@ NSString *const kUserInfoTenantAlbumStatus = @"tenantAlbumStatus";
 NSString *const kUserInfoUserVip = @"userVip";
 NSString *const kUserInfoUserCustomerService = @"customerService";
 
+NSString *const kUserInfoUserCustomerServiceNum = @"customerServiceNum";
+NSString *const kUserInfoUserImCustomerId = @"imCustomerId";
+
 
 @interface UserInfo ()
 
@@ -164,6 +167,8 @@ NSString *const kUserInfoUserCustomerService = @"customerService";
 @synthesize tenantAlbumStatus = _tenantAlbumStatus;
 @synthesize userVip = _userVip;
 @synthesize customerService = _customerService;
+@synthesize customerServiceNum = _customerServiceNum;
+@synthesize imCustomerId = _imCustomerId;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -262,6 +267,8 @@ NSString *const kUserInfoUserCustomerService = @"customerService";
         self.tenantAlbumStatus = [[self objectOrNilForKey:kUserInfoTenantAlbumStatus fromDictionary:dict] integerValue];
         self.userVip = [UserVip modelObjectWithDictionary:[dict objectForKey:kUserInfoUserVip]];
         self.customerService = [[self objectOrNilForKey:kUserInfoUserCustomerService fromDictionary:dict] boolValue];
+        self.customerServiceNum = [[self objectOrNilForKey:kUserInfoUserCustomerServiceNum fromDictionary:dict] integerValue];
+        self.imCustomerId = [self objectOrNilForKey:kUserInfoUserImCustomerId fromDictionary:dict];
     }
     
     return self;
@@ -354,6 +361,9 @@ NSString *const kUserInfoUserCustomerService = @"customerService";
     [mutableDict setValue:[NSNumber numberWithInteger:self.tenantAlbumStatus] forKey:kUserInfoTenantAlbumStatus];
     [mutableDict setValue:[self.userVip dictionaryRepresentation] forKey:kUserInfoUserVip];
     [mutableDict setValue:[NSNumber numberWithBool:self.customerService] forKey:kUserInfoUserCustomerService];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.customerServiceNum] forKey:kUserInfoUserCustomerServiceNum];
+    [mutableDict setValue:self.imCustomerId forKey:kUserInfoUserImCustomerId];
+    
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -453,6 +463,9 @@ NSString *const kUserInfoUserCustomerService = @"customerService";
     self.tenantAlbumStatus = [aDecoder decodeIntegerForKey:kUserInfoTenantAlbumStatus];
     self.userVip = [aDecoder decodeObjectForKey:kUserInfoUserVip];
     self.customerService = [aDecoder decodeBoolForKey:kUserInfoUserCustomerService];
+    self.customerServiceNum = [aDecoder decodeIntegerForKey:kUserInfoUserCustomerServiceNum];
+    self.imCustomerId = [aDecoder decodeObjectForKey:kUserInfoUserImCustomerId];
+    
     return self;
 }
 
@@ -532,6 +545,8 @@ NSString *const kUserInfoUserCustomerService = @"customerService";
     [aCoder encodeInteger:_tenantAlbumStatus forKey:kUserInfoTenantAlbumStatus];
     [aCoder encodeObject:_userVip forKey:kUserInfoUserVip];
     [aCoder encodeBool:_customerService forKey:kUserInfoUserCustomerService];
+    [aCoder encodeInteger:_customerServiceNum forKey:kUserInfoUserCustomerServiceNum];
+    [aCoder encodeObject:_imCustomerId forKey:kUserInfoUserImCustomerId];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -613,6 +628,8 @@ NSString *const kUserInfoUserCustomerService = @"customerService";
         copy.tenantAlbumStatus = self.tenantAlbumStatus;
         copy.userVip = [self.userVip copyWithZone:zone];
         copy.customerService = self.customerService;
+        copy.customerServiceNum = self.customerServiceNum;
+        copy.imCustomerId = [self.imCustomerId copyWithZone:zone];
     }
     
     return copy;

+ 42 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Controller/MineViewController.m

@@ -40,6 +40,8 @@
 #import "TenantMineHeadView.h"
 #import "MineWorksViewController.h"
 
+#import "KSChatConversationViewController.h"
+
 @interface MineViewController ()<UIScrollViewDelegate>
 
 @property (nonatomic, strong) MineNavView *navView;
@@ -173,6 +175,7 @@
     
     self.bottomView.isMember = isMember;
     self.bottomView.isSettlement = NO; // 关闭推广功能
+    self.bottomView.hasSustomService = self.mineInfo.customerServiceNum > 0 ? YES : NO;
     CGFloat bottomViewHeight = [self.bottomView getViewHeight];
     [self.bottomView mas_updateConstraints:^(MASConstraintMaker *make) {
         make.height.mas_equalTo(bottomViewHeight);
@@ -544,11 +547,50 @@
             [self.navigationController pushViewController:ctrl animated:YES];
         }
             break;
+        case MINEVIEWTYPE_CUSTOMSERVICE:
+        {
+            if (self.bottomView.hasSustomService) {
+                if ([NSString isEmptyString:self.mineInfo.imCustomerId]) {
+                    [self queryCustomService];
+                }
+                else {
+                    [self chatWithCustomService:self.mineInfo.imCustomerId];
+                }
+            }
+        }
+            break;
         default:
             break;
     }
 }
 
+- (void)queryCustomService {
+    [KSNetworkingManager updateUserCustomerServiceRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200) {
+            NSString *imCustomerId = [dic ks_stringValueForKey:@"data"];
+            if (![NSString isEmptyString:imCustomerId]) {
+                [self chatWithCustomService:imCustomerId];
+            }
+            else {
+                [LOADING_MANAGER MBShowAUTOHidingInWindow:@"未找到分配客服"];
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)chatWithCustomService:(NSString *)imUserId {
+    TUIChatConversationModel *model = [[TUIChatConversationModel alloc] init];
+    model.userID = imUserId;
+    KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
+    ctrl.conversation = model;
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
 - (BadgeIntroduceView *)intruduceAlert {
     if (!_intruduceAlert) {
         _intruduceAlert = [BadgeIntroduceView shareInstance];

+ 3 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Model/TeacherInfo.h

@@ -63,6 +63,9 @@
 @property (nonatomic, strong) UserVip *userVip;
 @property (nonatomic, assign) BOOL customerService;
 
+@property (nonatomic, assign) NSInteger customerServiceNum; // 客服数量
+@property (nonatomic, strong) NSString *imCustomerId; // 客服ID
+
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;
 - (NSDictionary *)dictionaryRepresentation;

+ 15 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Model/TeacherInfo.m

@@ -54,6 +54,8 @@ NSString *const kTeacherInfoDefaultSubjectName = @"defaultSubjectName";
 NSString *const kTeacherInfoUserVip = @"userVip";
 NSString *const kTeacherInfoCustomerService = @"customerService";
 
+NSString *const kTeacherInfoCustomerServiceNum = @"customerServiceNum";
+NSString *const kTeacherInfoImCustomerId = @"imCustomerId";
 @interface TeacherInfo ()
 
 - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
@@ -107,6 +109,8 @@ NSString *const kTeacherInfoCustomerService = @"customerService";
 @synthesize defaultSubjectName = _defaultSubjectName;
 @synthesize userVip = _userVip;
 @synthesize customerService = _customerService;
+@synthesize customerServiceNum = _customerServiceNum;
+@synthesize imCustomerId = _imCustomerId;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -165,6 +169,8 @@ NSString *const kTeacherInfoCustomerService = @"customerService";
         self.defaultSubjectName = [self objectOrNilForKey:kTeacherInfoDefaultSubjectName fromDictionary:dict];
         self.userVip = [UserVip modelObjectWithDictionary:[dict objectForKey:kTeacherInfoUserVip]];
         self.customerService = [[self objectOrNilForKey:kTeacherInfoCustomerService fromDictionary:dict] boolValue];
+        self.customerServiceNum = [[self objectOrNilForKey:kTeacherInfoCustomerServiceNum fromDictionary:dict] integerValue];
+        self.imCustomerId = [self objectOrNilForKey:kTeacherInfoImCustomerId fromDictionary:dict];
     }
     
     return self;
@@ -219,6 +225,8 @@ NSString *const kTeacherInfoCustomerService = @"customerService";
     [mutableDict setValue:self.defaultSubjectName forKey:kTeacherInfoDefaultSubjectName];
     [mutableDict setValue:[self.userVip dictionaryRepresentation] forKey:kTeacherInfoUserVip];
     [mutableDict setValue:[NSNumber numberWithBool:self.customerService] forKey:kTeacherInfoCustomerService];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.customerServiceNum] forKey:kTeacherInfoCustomerServiceNum];
+    [mutableDict setValue:self.imCustomerId forKey:kTeacherInfoImCustomerId];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -290,6 +298,8 @@ NSString *const kTeacherInfoCustomerService = @"customerService";
     self.defaultSubjectName = [aDecoder decodeObjectForKey:kTeacherInfoDefaultSubjectName];
     self.userVip = [aDecoder decodeObjectForKey:kTeacherInfoUserVip];
     self.customerService = [aDecoder decodeBoolForKey:kTeacherInfoCustomerService];
+    self.customerServiceNum = [aDecoder decodeIntegerForKey:kTeacherInfoCustomerServiceNum];
+    self.imCustomerId = [aDecoder decodeObjectForKey:kTeacherInfoImCustomerId];
     return self;
 }
 
@@ -341,7 +351,8 @@ NSString *const kTeacherInfoCustomerService = @"customerService";
     [aCoder encodeObject:_defaultSubjectName forKey:kTeacherInfoDefaultSubjectName];
     [aCoder encodeObject:_userVip forKey:kTeacherInfoUserVip];
     [aCoder encodeBool:_customerService forKey:kTeacherInfoCustomerService];
-
+    [aCoder encodeInteger:_customerServiceNum forKey:kTeacherInfoCustomerServiceNum];
+    [aCoder encodeObject:_imCustomerId forKey:kTeacherInfoImCustomerId];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -395,6 +406,9 @@ NSString *const kTeacherInfoCustomerService = @"customerService";
         copy.defaultSubjectName = [self.defaultSubjectName copyWithZone:zone];
         copy.userVip = [self.userVip copyWithZone:zone];
         copy.customerService = self.customerService;
+        copy.customerServiceNum = self.customerServiceNum;
+        copy.imCustomerId = [self.imCustomerId copyWithZone:zone];
+
     }
     return copy;
 }

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineActionView.h

@@ -40,6 +40,7 @@ typedef NS_ENUM(NSInteger, MINEVIEWTYPE) {
     MINEVIEWTYPE_AWARD,
     MINENAVATYPE_COURSEWARE,  // 课件
     MINEVIEWTYPE_WORKS,       // 我的作品
+    MINEVIEWTYPE_CUSTOMSERVICE = 1033, // 客服
 };
 
 #define FUNCTIONVIEW_WIDTH (80)

+ 2 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBottomView.h

@@ -18,6 +18,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic, assign) BOOL isSettlement; // 是否结算 1 结算
 
+@property (nonatomic, assign) BOOL hasSustomService; // 是否有客服
+
 @property (weak, nonatomic) IBOutlet UILabel *shareAmountLabel;
 
 

+ 19 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBottomView.m

@@ -19,6 +19,9 @@
 
 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *spreadViewHeight;
 
+@property (weak, nonatomic) IBOutlet UIView *customServiceView;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *customServiceHeight;
+
 @end
 
 @implementation MineBottomView
@@ -40,13 +43,16 @@
 }
 
 - (CGFloat)getViewHeight {
-    CGFloat defaultHeight = 544.0f;
+    CGFloat defaultHeight = 604.0f;
     if (self.isMember == NO) {
         defaultHeight -= 60.0f;
     }
     if (self.isSettlement == NO) {
         defaultHeight -= 60.0f;
     }
+    if (self.hasSustomService == NO) {
+        defaultHeight -= 60.0f;
+    }
     CGFloat viewHeight = defaultHeight;
     return viewHeight;
 }
@@ -75,6 +81,18 @@
     }
 }
 
+- (void)setHasSustomService:(BOOL)hasSustomService {
+    _hasSustomService = hasSustomService;
+    if (hasSustomService) {
+        self.customServiceView.hidden = NO;
+        self.customServiceHeight.constant = 60.0f;
+    }
+    else {
+        self.customServiceView.hidden = YES;
+        self.customServiceHeight.constant = 0.0f;
+    }
+}
+
 
 - (IBAction)tapAction:(UITapGestureRecognizer *)sender {
     NSInteger index = sender.view.tag;

+ 45 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBottomView.xib

@@ -240,7 +240,7 @@
                     </userDefinedRuntimeAttributes>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vIt-8T-p6j">
-                    <rect key="frame" x="14" y="272" width="386" height="200"/>
+                    <rect key="frame" x="14" y="272" width="386" height="260"/>
                     <subviews>
                         <view tag="1013" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="440-4e-PTN">
                             <rect key="frame" x="0.0" y="10" width="386" height="60"/>
@@ -341,18 +341,54 @@
                                 <outletCollection property="gestureRecognizers" destination="5MN-g7-38B" appends="YES" id="sa4-AA-TDV"/>
                             </connections>
                         </view>
+                        <view tag="1033" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rii-Fh-ble">
+                            <rect key="frame" x="0.0" y="190" width="386" height="60"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="在线客服" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ege-Yh-oec">
+                                    <rect key="frame" x="15" y="20.5" width="120" height="19.5"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="120" id="371-mE-p5W"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="UJM-OY-4Nl">
+                                    <rect key="frame" x="362" y="24.5" width="6" height="11"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="11" id="8qD-VX-t5N"/>
+                                        <constraint firstAttribute="width" constant="6" id="SdL-z6-c2t"/>
+                                    </constraints>
+                                </imageView>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <gestureRecognizers/>
+                            <constraints>
+                                <constraint firstItem="UJM-OY-4Nl" firstAttribute="centerY" secondItem="rii-Fh-ble" secondAttribute="centerY" id="4Pf-7e-3R4"/>
+                                <constraint firstItem="ege-Yh-oec" firstAttribute="centerY" secondItem="rii-Fh-ble" secondAttribute="centerY" id="Mps-FX-gUg"/>
+                                <constraint firstAttribute="height" constant="60" id="TMq-VA-LnG"/>
+                                <constraint firstAttribute="trailing" secondItem="UJM-OY-4Nl" secondAttribute="trailing" constant="18" id="WcS-2f-Ark"/>
+                                <constraint firstItem="ege-Yh-oec" firstAttribute="leading" secondItem="rii-Fh-ble" secondAttribute="leading" constant="15" id="qfG-Od-qhA"/>
+                            </constraints>
+                            <connections>
+                                <outletCollection property="gestureRecognizers" destination="hjv-CP-GnW" appends="YES" id="uXi-qY-NkL"/>
+                            </connections>
+                        </view>
                     </subviews>
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
                         <constraint firstItem="lHY-3p-URu" firstAttribute="leading" secondItem="vIt-8T-p6j" secondAttribute="leading" id="716-HL-pbD"/>
                         <constraint firstItem="lHY-3p-URu" firstAttribute="top" secondItem="9Tk-UG-5sp" secondAttribute="bottom" id="86x-1v-dAS"/>
+                        <constraint firstAttribute="trailing" secondItem="rii-Fh-ble" secondAttribute="trailing" id="EUZ-as-4hC"/>
                         <constraint firstAttribute="trailing" secondItem="9Tk-UG-5sp" secondAttribute="trailing" id="JoA-BX-aI4"/>
                         <constraint firstItem="9Tk-UG-5sp" firstAttribute="top" secondItem="440-4e-PTN" secondAttribute="bottom" id="Otg-dm-WR2"/>
-                        <constraint firstAttribute="bottom" secondItem="lHY-3p-URu" secondAttribute="bottom" constant="10" id="Xq6-kp-Tdp"/>
                         <constraint firstItem="440-4e-PTN" firstAttribute="leading" secondItem="vIt-8T-p6j" secondAttribute="leading" id="e2a-dm-vsW"/>
+                        <constraint firstItem="rii-Fh-ble" firstAttribute="leading" secondItem="vIt-8T-p6j" secondAttribute="leading" id="fet-if-C3D"/>
                         <constraint firstAttribute="trailing" secondItem="440-4e-PTN" secondAttribute="trailing" id="gwb-20-Cz1"/>
+                        <constraint firstAttribute="bottom" secondItem="rii-Fh-ble" secondAttribute="bottom" constant="10" id="hXL-3c-Taw"/>
                         <constraint firstItem="9Tk-UG-5sp" firstAttribute="leading" secondItem="vIt-8T-p6j" secondAttribute="leading" id="jiX-Bj-4Yq"/>
                         <constraint firstAttribute="trailing" secondItem="lHY-3p-URu" secondAttribute="trailing" id="jwp-2m-o1H"/>
+                        <constraint firstItem="rii-Fh-ble" firstAttribute="top" secondItem="lHY-3p-URu" secondAttribute="bottom" id="tcU-Rd-pMh"/>
                         <constraint firstItem="440-4e-PTN" firstAttribute="top" secondItem="vIt-8T-p6j" secondAttribute="top" constant="10" id="unk-Kp-xjP"/>
                     </constraints>
                     <userDefinedRuntimeAttributes>
@@ -388,6 +424,8 @@
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
             <connections>
                 <outlet property="bandStatusView" destination="O96-Xz-BAp" id="cea-xJ-FrQ"/>
+                <outlet property="customServiceHeight" destination="TMq-VA-LnG" id="OX6-IB-FTT"/>
+                <outlet property="customServiceView" destination="rii-Fh-ble" id="CPa-Ub-ni1"/>
                 <outlet property="shareAmountLabel" destination="R1A-TC-V7v" id="R6u-eQ-3Gg"/>
                 <outlet property="spreadView" destination="Fef-w6-G6G" id="Dgh-3S-mi9"/>
                 <outlet property="spreadViewHeight" destination="5Hv-uN-ddI" id="YCa-1q-YXD"/>
@@ -436,6 +474,11 @@
                 <action selector="tapAction:" destination="iN0-l3-epB" id="S1L-3w-GHp"/>
             </connections>
         </tapGestureRecognizer>
+        <tapGestureRecognizer id="hjv-CP-GnW">
+            <connections>
+                <action selector="tapAction:" destination="iN0-l3-epB" id="XRN-UL-Pib"/>
+            </connections>
+        </tapGestureRecognizer>
     </objects>
     <resources>
         <image name="mine_next" width="6" height="11"/>