浏览代码

首页+消息列表

Steven 5 年之前
父节点
当前提交
eaaceaef1b
共有 34 个文件被更改,包括 1085 次插入3 次删除
  1. 26 0
      MusicGradeExam/MusicGradeExam.xcodeproj/project.pbxproj
  2. 2 2
      MusicGradeExam/MusicGradeExam/AppDelegate.m
  3. 6 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/Contents.json
  4. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/book_record.imageset/Contents.json
  5. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/book_record.imageset/book_record@2x.png
  6. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/book_record.imageset/book_record@3x.png
  7. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/count_bg.imageset/Contents.json
  8. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/count_bg.imageset/count_bg@2x.png
  9. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/count_bg.imageset/count_bg@3x.png
  10. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/exam_record.imageset/Contents.json
  11. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/exam_record.imageset/exam_record@2x.png
  12. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/exam_record.imageset/exam_record@3x.png
  13. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_read.imageset/Contents.json
  14. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_read.imageset/notice_read@2x.png
  15. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_read.imageset/notice_read@3x.png
  16. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_unread.imageset/Contents.json
  17. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_unread.imageset/notice_unread@2x.png
  18. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_unread.imageset/notice_unread@3x.png
  19. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notify_image.imageset/Contents.json
  20. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notify_image.imageset/notify_image@2x.png
  21. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notify_image.imageset/notify_image@3x.png
  22. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/record_detail.imageset/Contents.json
  23. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/record_detail.imageset/record_detail@2x.png
  24. 二进制
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/record_detail.imageset/record_detail@3x.png
  25. 76 0
      MusicGradeExam/MusicGradeExam/UI/Home/Controller/HomeViewController.m
  26. 34 0
      MusicGradeExam/MusicGradeExam/UI/Home/View/HomeBodyView.h
  27. 59 0
      MusicGradeExam/MusicGradeExam/UI/Home/View/HomeBodyView.m
  28. 226 0
      MusicGradeExam/MusicGradeExam/UI/Home/View/HomeBodyView.xib
  29. 110 1
      MusicGradeExam/MusicGradeExam/UI/NotiferMessage/Controller/NotifyMessageViewController.m
  30. 31 0
      MusicGradeExam/MusicGradeExam/UI/NotiferMessage/Model/MessageListModel.h
  31. 183 0
      MusicGradeExam/MusicGradeExam/UI/NotiferMessage/Model/MessageListModel.m
  32. 21 0
      MusicGradeExam/MusicGradeExam/UI/NotiferMessage/View/NotifyMessageCell.h
  33. 55 0
      MusicGradeExam/MusicGradeExam/UI/NotiferMessage/View/NotifyMessageCell.m
  34. 102 0
      MusicGradeExam/MusicGradeExam/UI/NotiferMessage/View/NotifyMessageCell.xib

+ 26 - 0
MusicGradeExam/MusicGradeExam.xcodeproj/project.pbxproj

@@ -314,6 +314,11 @@
 		27A008F424BDB1E50002452B /* UserInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008F224BDB1E50002452B /* UserInfo.m */; };
 		27A008F724BDB6220002452B /* UserBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008F624BDB6220002452B /* UserBodyView.m */; };
 		27A008F924BDB6310002452B /* UserBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008F824BDB6310002452B /* UserBodyView.xib */; };
+		27A008FC24BECDC40002452B /* HomeBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008FB24BECDC40002452B /* HomeBodyView.m */; };
+		27A008FE24BECDFC0002452B /* HomeBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008FD24BECDFC0002452B /* HomeBodyView.xib */; };
+		27EF3EEE24BEE35E002068A2 /* MessageListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 27EF3EED24BEE35E002068A2 /* MessageListModel.m */; };
+		27EF3EF224BEE885002068A2 /* NotifyMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 27EF3EF024BEE885002068A2 /* NotifyMessageCell.m */; };
+		27EF3EF324BEE885002068A2 /* NotifyMessageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27EF3EF124BEE885002068A2 /* NotifyMessageCell.xib */; };
 		52771C0027351695CEDB4C8E /* libPods-MusicGradeExam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C12DE728E343C25BB5998D7 /* libPods-MusicGradeExam.a */; };
 		5577ECF41C84E1BDFEC99DBC /* libPods-MusicGradeExamTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BAA64634BC925E7C2CD7008 /* libPods-MusicGradeExamTests.a */; };
 		A7C23B2E920E232C71C39B0E /* libPods-MusicGradeExam-MusicGradeExamUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F8D13E0A14104E75F7922812 /* libPods-MusicGradeExam-MusicGradeExamUITests.a */; };
@@ -912,6 +917,14 @@
 		27A008F524BDB6220002452B /* UserBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserBodyView.h; sourceTree = "<group>"; };
 		27A008F624BDB6220002452B /* UserBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserBodyView.m; sourceTree = "<group>"; };
 		27A008F824BDB6310002452B /* UserBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UserBodyView.xib; sourceTree = "<group>"; };
+		27A008FA24BECDC40002452B /* HomeBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeBodyView.h; sourceTree = "<group>"; };
+		27A008FB24BECDC40002452B /* HomeBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeBodyView.m; sourceTree = "<group>"; };
+		27A008FD24BECDFC0002452B /* HomeBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeBodyView.xib; sourceTree = "<group>"; };
+		27EF3EEC24BEE35E002068A2 /* MessageListModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessageListModel.h; sourceTree = "<group>"; };
+		27EF3EED24BEE35E002068A2 /* MessageListModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MessageListModel.m; sourceTree = "<group>"; };
+		27EF3EEF24BEE885002068A2 /* NotifyMessageCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotifyMessageCell.h; sourceTree = "<group>"; };
+		27EF3EF024BEE885002068A2 /* NotifyMessageCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotifyMessageCell.m; sourceTree = "<group>"; };
+		27EF3EF124BEE885002068A2 /* NotifyMessageCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NotifyMessageCell.xib; sourceTree = "<group>"; };
 		2BB32BBE582672362BB6E017 /* Pods-MusicGradeExam-MusicGradeExamUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicGradeExam-MusicGradeExamUITests.release.xcconfig"; path = "Target Support Files/Pods-MusicGradeExam-MusicGradeExamUITests/Pods-MusicGradeExam-MusicGradeExamUITests.release.xcconfig"; sourceTree = "<group>"; };
 		2F7D3758362ED28D51286A60 /* Pods-MusicGradeExam.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicGradeExam.debug.xcconfig"; path = "Target Support Files/Pods-MusicGradeExam/Pods-MusicGradeExam.debug.xcconfig"; sourceTree = "<group>"; };
 		5402063E714DA9D9107F8070 /* Pods-MusicGradeExamTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicGradeExamTests.debug.xcconfig"; path = "Target Support Files/Pods-MusicGradeExamTests/Pods-MusicGradeExamTests.debug.xcconfig"; sourceTree = "<group>"; };
@@ -1289,6 +1302,9 @@
 		2747700924BC0C0100181362 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				27A008FA24BECDC40002452B /* HomeBodyView.h */,
+				27A008FB24BECDC40002452B /* HomeBodyView.m */,
+				27A008FD24BECDFC0002452B /* HomeBodyView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -1564,6 +1580,8 @@
 		2747705E24BC0C0100181362 /* Model */ = {
 			isa = PBXGroup;
 			children = (
+				27EF3EEC24BEE35E002068A2 /* MessageListModel.h */,
+				27EF3EED24BEE35E002068A2 /* MessageListModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -1571,6 +1589,9 @@
 		2747705F24BC0C0100181362 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				27EF3EEF24BEE885002068A2 /* NotifyMessageCell.h */,
+				27EF3EF024BEE885002068A2 /* NotifyMessageCell.m */,
+				27EF3EF124BEE885002068A2 /* NotifyMessageCell.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -2443,6 +2464,7 @@
 				27A008A724BD96C50002452B /* NetworkBodyView.xib in Resources */,
 				2794D1C924BD631A00BAF6F3 /* ModifyBodyView.xib in Resources */,
 				27A008DB24BDA6950002452B /* PhoneChangeBodyView.xib in Resources */,
+				27A008FE24BECDFC0002452B /* HomeBodyView.xib in Resources */,
 				274771AC24BC0C0500181362 /* mss_browseLoading@3x.png in Resources */,
 				274771ED24BC0C0500181362 /* LoginBodyView.xib in Resources */,
 				2794D1BA24BC69A400BAF6F3 /* RegisterBodyView.xib in Resources */,
@@ -2454,6 +2476,7 @@
 				2747728224BC0C7D00181362 /* Emoji.plist in Resources */,
 				2747728024BC0C7C00181362 /* RongCloudKit.strings in Resources */,
 				27476F5124BBFB5900181362 /* Main.storyboard in Resources */,
+				27EF3EF324BEE885002068A2 /* NotifyMessageCell.xib in Resources */,
 				27A008A924BD96C50002452B /* KSNetworkAlert.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -2654,6 +2677,7 @@
 				2747719F24BC0C0500181362 /* SCIndexViewConfiguration.m in Sources */,
 				2747720D24BC0C0500181362 /* UIView+AddConstraints.m in Sources */,
 				274771BC24BC0C0500181362 /* ALCalendarCollectionView.m in Sources */,
+				27EF3EF224BEE885002068A2 /* NotifyMessageCell.m in Sources */,
 				274771F424BC0C0500181362 /* KSLRUManager.m in Sources */,
 				2747718C24BC0C0500181362 /* FastForwardView.m in Sources */,
 				2747718724BC0C0500181362 /* JYEqualCellSpaceFlowLayout.m in Sources */,
@@ -2772,6 +2796,7 @@
 				274771FB24BC0C0500181362 /* NSMutableArray+KSSafe.m in Sources */,
 				274771D724BC0C0500181362 /* RoleChangedMessage.m in Sources */,
 				27A008F324BDB1E50002452B /* SysUser.m in Sources */,
+				27EF3EEE24BEE35E002068A2 /* MessageListModel.m in Sources */,
 				2747725824BC0C0500181362 /* SkipTextView.m in Sources */,
 				2747725E24BC0C0500181362 /* KSInputView.m in Sources */,
 				2747719C24BC0C0500181362 /* TZLocationManager.m in Sources */,
@@ -2784,6 +2809,7 @@
 				27A008A624BD96C50002452B /* NetworkBodyView.m in Sources */,
 				274771C224BC0C0500181362 /* KSBaseViewController.m in Sources */,
 				2794D1B524BC662600BAF6F3 /* VeriCheckView.m in Sources */,
+				27A008FC24BECDC40002452B /* HomeBodyView.m in Sources */,
 				2747722D24BC0C0500181362 /* KSRecordStatusView.m in Sources */,
 				27A008A824BD96C50002452B /* KSNetworkAlert.m in Sources */,
 				2747719224BC0C0500181362 /* TZAssetModel.m in Sources */,

+ 2 - 2
MusicGradeExam/MusicGradeExam/AppDelegate.m

@@ -279,8 +279,8 @@
     [[RCIMClient sharedRCIMClient] setReconnectKickEnable:YES];
     
     
-    [[RCIMClient sharedRCIMClient] setLogLevel:RC_Log_Level_Verbose];
-    [self redirectNSlogToDocumentFolder];
+//    [[RCIMClient sharedRCIMClient] setLogLevel:RC_Log_Level_Verbose];
+//    [self redirectNSlogToDocumentFolder];
     
 }
 

+ 6 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/book_record.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "book_record@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "book_record@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/book_record.imageset/book_record@2x.png


二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/book_record.imageset/book_record@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/count_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "count_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "count_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/count_bg.imageset/count_bg@2x.png


二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/count_bg.imageset/count_bg@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/exam_record.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "exam_record@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "exam_record@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/exam_record.imageset/exam_record@2x.png


二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/exam_record.imageset/exam_record@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_read.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "notice_read@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "notice_read@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_read.imageset/notice_read@2x.png


二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_read.imageset/notice_read@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_unread.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "notice_unread@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "notice_unread@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_unread.imageset/notice_unread@2x.png


二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notice_unread.imageset/notice_unread@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notify_image.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "notify_image@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "notify_image@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notify_image.imageset/notify_image@2x.png


二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/notify_image.imageset/notify_image@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/record_detail.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_detail@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_detail@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/record_detail.imageset/record_detail@2x.png


二进制
MusicGradeExam/MusicGradeExam/Assets.xcassets/Home/record_detail.imageset/record_detail@3x.png


+ 76 - 0
MusicGradeExam/MusicGradeExam/UI/Home/Controller/HomeViewController.m

@@ -7,9 +7,14 @@
 //
 
 #import "HomeViewController.h"
+#import "HomeBodyView.h"
+#import "NotifyMessageViewController.h"
+#import "KSBaseWKWebViewController.h"
 
 @interface HomeViewController ()
 
+@property (nonatomic, strong) HomeBodyView *bodyView;
+
 @end
 
 @implementation HomeViewController
@@ -17,6 +22,77 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
+    self.ks_prefersNavigationBarHidden = YES;
+    [self configUI];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self requestMessage];
+}
+
+- (void)requestMessage {
+    // 获取信息
+    // 1. 获取未读数量
+    // 2. 获取最近考试信息
+}
+
+- (void)configUI {
+    self.scrollView.backgroundColor = HexRGB(0xf3f4f8);
+    _bodyView = [HomeBodyView shareInstance];
+    CGFloat recordHeight = (kScreenWidth - 24) / 13 * 4;
+    CGFloat viewHeight = recordHeight * 3 + 30 + kScreenWidth / 375 * 158 + 73 + 15;
+    viewHeight = kScreenHeight - kTabBarHeight ? viewHeight : kScreenHeight - kTabBarHeight;
+    _bodyView.frame = CGRectMake(0, 0, kScreenWidth, viewHeight);
+    MJWeakSelf;
+    [_bodyView buttonClickCallback:^(HOMETYPE type) {
+        [weakSelf opreationAction:type];
+    }];
+    [self.scrollView addSubview:_bodyView];
+    [self.scrollView setContentSize:CGSizeMake(kScreenWidth, viewHeight)];
+    if (@available(iOS 11.0, *)) {
+        self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+    } else {
+        // Fallback on earlier versions
+        self.automaticallyAdjustsScrollViewInsets = NO;
+    }
+}
+
+- (void)opreationAction:(HOMETYPE)type {
+    switch (type) {
+        case HOMETYPE_NOTICE: // 通知
+        {
+            NotifyMessageViewController *noticeVC = [[NotifyMessageViewController alloc] init];
+            [self.navigationController pushViewController:noticeVC animated:YES];
+        }
+            break;
+        case HOMETYPE_BOOKRECORD: // 报考记录
+        {
+            KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+            ctrl.url = @"https://www.baidu.com";
+            ctrl.hiddenNavBar = NO;
+            ctrl.headTitle = @"报考记录";
+            [self.navigationController pushViewController:ctrl animated:YES];
+            
+        }
+            break;
+        case HOMETYPE_EXAMRECORD: //考试记录
+        {
+            KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+            ctrl.url = @"http://www.baidu.com";
+            ctrl.hiddenNavBar = NO;
+            ctrl.headTitle = @"考试记录";
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+            break;
+        case HOMETYPE_MUSICLIBRARY: // 考级曲库
+        {
+            
+        }
+            break;
+        default:
+            break;
+    }
 }
 
 /*

+ 34 - 0
MusicGradeExam/MusicGradeExam/UI/Home/View/HomeBodyView.h

@@ -0,0 +1,34 @@
+//
+//  HomeBodyView.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/15.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, HOMETYPE) {
+    HOMETYPE_NOTICE = 1,   // 通知
+    HOMETYPE_BOOKRECORD,   // 报考记录
+    HOMETYPE_EXAMRECORD,   // 考试记录
+    HOMETYPE_MUSICLIBRARY, // 考级曲库
+};
+
+typedef void(^HomeButtonClick)(HOMETYPE type);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HomeBodyView : UIView
+
+@property (weak, nonatomic) IBOutlet UIButton *noticeButton;
+
+@property (weak, nonatomic) IBOutlet UIView *scollBgView;
+
++ (instancetype)shareInstance;
+
+- (void)buttonClickCallback:(HomeButtonClick)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 59 - 0
MusicGradeExam/MusicGradeExam/UI/Home/View/HomeBodyView.m

@@ -0,0 +1,59 @@
+//
+//  HomeBodyView.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/15.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "HomeBodyView.h"
+
+@interface HomeBodyView ()
+
+@property (nonatomic, copy) HomeButtonClick callback;
+
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bgHeight;
+
+@end
+
+@implementation HomeBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+}
+
++ (instancetype)shareInstance {
+    HomeBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)buttonClickCallback:(HomeButtonClick)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)buttonClickAction:(id)sender {
+    if (self.callback) {
+        self.callback(HOMETYPE_NOTICE);
+    }
+}
+
+
+- (IBAction)tapAction:(UITapGestureRecognizer *)sender {
+    if (self.callback) {
+        NSInteger index = sender.view.tag - 1000;
+        self.callback(index);
+    }
+}
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 226 - 0
MusicGradeExam/MusicGradeExam/UI/Home/View/HomeBodyView.xib

@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="UE7-CX-F3s">
+                    <rect key="frame" x="0.0" y="0.0" width="414" height="174.5"/>
+                    <constraints>
+                        <constraint firstAttribute="width" secondItem="UE7-CX-F3s" secondAttribute="height" multiplier="375:158" id="spA-lC-yEg"/>
+                    </constraints>
+                </imageView>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="deZ-CC-Tlw">
+                    <rect key="frame" x="16" y="101.5" width="382" height="146"/>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="146" id="tdc-1f-NK3"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="calibratedRGB"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="4"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="8"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <button opaque="NO" tag="1001" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pm2-TK-yzh">
+                    <rect key="frame" x="364" y="46.5" width="40" height="40"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="40" id="C4X-wk-y2Q"/>
+                        <constraint firstAttribute="width" constant="40" id="S9o-kq-zZV"/>
+                    </constraints>
+                    <state key="normal" image="notice_unread"/>
+                    <connections>
+                        <action selector="buttonClickAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="WhJ-yF-Z16"/>
+                    </connections>
+                </button>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="酷乐秀" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qJ1-Pm-qsl">
+                    <rect key="frame" x="16" y="52" width="73" height="29"/>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="24"/>
+                    <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" tag="1002" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="book_record" translatesAutoresizingMaskIntoConstraints="NO" id="FTX-tf-JYt">
+                    <rect key="frame" x="12" y="262.5" width="390" height="120"/>
+                    <gestureRecognizers/>
+                    <constraints>
+                        <constraint firstAttribute="width" secondItem="FTX-tf-JYt" secondAttribute="height" multiplier="13:4" id="wNV-53-ocO"/>
+                    </constraints>
+                    <connections>
+                        <outletCollection property="gestureRecognizers" destination="0cz-kF-eTZ" appends="YES" id="UGr-Vs-gwh"/>
+                    </connections>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报考记录" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="71n-fC-CqF">
+                    <rect key="frame" x="32" y="297.5" width="74" height="25"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="25" id="MxA-yU-X9o"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" tag="1003" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="exam_record" translatesAutoresizingMaskIntoConstraints="NO" id="X8m-zH-diL">
+                    <rect key="frame" x="12" y="397.5" width="390" height="120"/>
+                    <gestureRecognizers/>
+                    <connections>
+                        <outletCollection property="gestureRecognizers" destination="g0m-kn-yMe" appends="YES" id="J0N-dX-A4b"/>
+                    </connections>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="您即将进行的考试" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="y0E-93-7ac">
+                    <rect key="frame" x="32" y="464.5" width="114.5" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="eD7-7U-5gB"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="考试记录" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="g1C-Ty-W4n">
+                    <rect key="frame" x="32" y="432.5" width="74" height="25"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="25" id="tTe-yW-e14"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="record_detail" translatesAutoresizingMaskIntoConstraints="NO" id="lSQ-oa-URI">
+                    <rect key="frame" x="151.5" y="465.5" width="14" height="18"/>
+                </imageView>
+                <imageView clipsSubviews="YES" tag="1004" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="exam_record" translatesAutoresizingMaskIntoConstraints="NO" id="6jn-Ca-srp">
+                    <rect key="frame" x="12" y="532.5" width="390" height="120"/>
+                    <gestureRecognizers/>
+                    <constraints>
+                        <constraint firstAttribute="width" secondItem="6jn-Ca-srp" secondAttribute="height" multiplier="13:4" id="We3-pT-D82"/>
+                    </constraints>
+                    <connections>
+                        <outletCollection property="gestureRecognizers" destination="hzg-Cm-ZWb" appends="YES" id="re3-Lm-wRD"/>
+                    </connections>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="进入考级曲库" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gd1-H6-mZc">
+                    <rect key="frame" x="32" y="599.5" width="86" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="oVm-Ho-adW"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="考级曲库" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ylI-OI-Itq">
+                    <rect key="frame" x="32" y="567.5" width="74" height="25"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="25" id="ClN-i1-S5V"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="record_detail" translatesAutoresizingMaskIntoConstraints="NO" id="3du-vq-z5T">
+                    <rect key="frame" x="123" y="600.5" width="14" height="18"/>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="您的报考记录" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aDg-7e-SV3">
+                    <rect key="frame" x="32" y="329.5" width="86" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="LRW-oG-3IF"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="record_detail" translatesAutoresizingMaskIntoConstraints="NO" id="J1M-Gy-55Y">
+                    <rect key="frame" x="123" y="330.5" width="14" height="18"/>
+                </imageView>
+            </subviews>
+            <color key="backgroundColor" red="0.95294117647058818" green="0.95686274509803915" blue="0.97254901960784312" alpha="1" colorSpace="calibratedRGB"/>
+            <constraints>
+                <constraint firstItem="FTX-tf-JYt" firstAttribute="top" secondItem="deZ-CC-Tlw" secondAttribute="bottom" constant="15" id="0OE-L8-r85"/>
+                <constraint firstItem="y0E-93-7ac" firstAttribute="leading" secondItem="g1C-Ty-W4n" secondAttribute="leading" id="1hr-61-kkQ"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="FTX-tf-JYt" secondAttribute="trailing" constant="12" id="2ha-2A-PGC"/>
+                <constraint firstItem="deZ-CC-Tlw" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="16" id="3Kr-dw-VIu"/>
+                <constraint firstItem="3du-vq-z5T" firstAttribute="leading" secondItem="Gd1-H6-mZc" secondAttribute="trailing" constant="5" id="4kX-qt-wMo"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="UE7-CX-F3s" secondAttribute="trailing" id="7Bf-Td-8s6"/>
+                <constraint firstItem="X8m-zH-diL" firstAttribute="width" secondItem="X8m-zH-diL" secondAttribute="height" multiplier="13:4" id="7Ow-SZ-xH1"/>
+                <constraint firstItem="X8m-zH-diL" firstAttribute="leading" secondItem="FTX-tf-JYt" secondAttribute="leading" id="8IJ-cL-MHB"/>
+                <constraint firstItem="lSQ-oa-URI" firstAttribute="centerY" secondItem="y0E-93-7ac" secondAttribute="centerY" id="9z9-g0-6Xn"/>
+                <constraint firstItem="pm2-TK-yzh" firstAttribute="centerY" secondItem="qJ1-Pm-qsl" secondAttribute="centerY" id="AjB-gW-5Oi"/>
+                <constraint firstItem="6jn-Ca-srp" firstAttribute="trailing" secondItem="FTX-tf-JYt" secondAttribute="trailing" id="EMt-8Q-idq"/>
+                <constraint firstItem="UE7-CX-F3s" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="ES7-0O-HYY"/>
+                <constraint firstItem="g1C-Ty-W4n" firstAttribute="bottom" secondItem="X8m-zH-diL" secondAttribute="centerY" id="FYP-mc-9EX"/>
+                <constraint firstItem="6jn-Ca-srp" firstAttribute="leading" secondItem="FTX-tf-JYt" secondAttribute="leading" id="IZb-ZI-5x6"/>
+                <constraint firstItem="J1M-Gy-55Y" firstAttribute="leading" secondItem="aDg-7e-SV3" secondAttribute="trailing" constant="5" id="KkW-2E-C2m"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="deZ-CC-Tlw" secondAttribute="trailing" constant="16" id="Nek-Xb-k8j"/>
+                <constraint firstItem="g1C-Ty-W4n" firstAttribute="leading" secondItem="X8m-zH-diL" secondAttribute="leading" constant="20" id="Se2-In-qdn"/>
+                <constraint firstItem="Gd1-H6-mZc" firstAttribute="top" secondItem="ylI-OI-Itq" secondAttribute="bottom" constant="7" id="TEV-is-ZS3"/>
+                <constraint firstItem="71n-fC-CqF" firstAttribute="leading" secondItem="FTX-tf-JYt" secondAttribute="leading" constant="20" id="VpC-SF-2LZ"/>
+                <constraint firstItem="3du-vq-z5T" firstAttribute="centerY" secondItem="Gd1-H6-mZc" secondAttribute="centerY" id="WOA-Fd-oVt"/>
+                <constraint firstItem="qJ1-Pm-qsl" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="16" id="XWG-Hi-LXu"/>
+                <constraint firstItem="6jn-Ca-srp" firstAttribute="top" secondItem="X8m-zH-diL" secondAttribute="bottom" constant="15" id="Xdu-ZS-WnO"/>
+                <constraint firstItem="deZ-CC-Tlw" firstAttribute="centerY" secondItem="UE7-CX-F3s" secondAttribute="bottom" id="aJJ-pq-Ad0"/>
+                <constraint firstItem="lSQ-oa-URI" firstAttribute="leading" secondItem="y0E-93-7ac" secondAttribute="trailing" constant="5" id="duC-ZB-gBe"/>
+                <constraint firstItem="X8m-zH-diL" firstAttribute="trailing" secondItem="FTX-tf-JYt" secondAttribute="trailing" id="eLs-5L-Yai"/>
+                <constraint firstItem="ylI-OI-Itq" firstAttribute="leading" secondItem="6jn-Ca-srp" secondAttribute="leading" constant="20" id="gmk-5l-Qbf"/>
+                <constraint firstItem="UE7-CX-F3s" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="hKP-bb-VyG"/>
+                <constraint firstItem="deZ-CC-Tlw" firstAttribute="top" secondItem="pm2-TK-yzh" secondAttribute="bottom" constant="15" id="iLw-WW-Lf8"/>
+                <constraint firstItem="J1M-Gy-55Y" firstAttribute="centerY" secondItem="aDg-7e-SV3" secondAttribute="centerY" id="oiT-pM-V6J"/>
+                <constraint firstItem="FTX-tf-JYt" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="12" id="ond-pM-vCq"/>
+                <constraint firstItem="aDg-7e-SV3" firstAttribute="top" secondItem="71n-fC-CqF" secondAttribute="bottom" constant="7" id="sZM-2r-jhV"/>
+                <constraint firstItem="y0E-93-7ac" firstAttribute="top" secondItem="g1C-Ty-W4n" secondAttribute="bottom" constant="7" id="tGA-jG-Bm1"/>
+                <constraint firstItem="71n-fC-CqF" firstAttribute="bottom" secondItem="FTX-tf-JYt" secondAttribute="centerY" id="upB-i4-JqE"/>
+                <constraint firstItem="Gd1-H6-mZc" firstAttribute="leading" secondItem="ylI-OI-Itq" secondAttribute="leading" id="wQf-uF-w9i"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="pm2-TK-yzh" secondAttribute="trailing" constant="10" id="wWc-Ul-kmu"/>
+                <constraint firstItem="ylI-OI-Itq" firstAttribute="bottom" secondItem="6jn-Ca-srp" secondAttribute="centerY" id="xHE-4u-yL6"/>
+                <constraint firstItem="aDg-7e-SV3" firstAttribute="leading" secondItem="71n-fC-CqF" secondAttribute="leading" id="xNP-fv-2MS"/>
+                <constraint firstItem="X8m-zH-diL" firstAttribute="top" secondItem="FTX-tf-JYt" secondAttribute="bottom" constant="15" id="zqL-CI-vbV"/>
+            </constraints>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <connections>
+                <outlet property="bgHeight" destination="tdc-1f-NK3" id="qls-C6-BA3"/>
+                <outlet property="noticeButton" destination="pm2-TK-yzh" id="D24-BB-F6h"/>
+                <outlet property="scollBgView" destination="deZ-CC-Tlw" id="3il-Dh-Bet"/>
+            </connections>
+            <point key="canvasLocation" x="131.8840579710145" y="105.80357142857143"/>
+        </view>
+        <tapGestureRecognizer id="0cz-kF-eTZ">
+            <connections>
+                <action selector="tapAction:" destination="iN0-l3-epB" id="2oP-m7-QR3"/>
+            </connections>
+        </tapGestureRecognizer>
+        <tapGestureRecognizer id="g0m-kn-yMe">
+            <connections>
+                <action selector="tapAction:" destination="iN0-l3-epB" id="xmA-Kb-uvf"/>
+            </connections>
+        </tapGestureRecognizer>
+        <tapGestureRecognizer id="hzg-Cm-ZWb">
+            <connections>
+                <action selector="tapAction:" destination="iN0-l3-epB" id="0B2-Pn-fxB"/>
+            </connections>
+        </tapGestureRecognizer>
+    </objects>
+    <resources>
+        <image name="book_record" width="351" height="120"/>
+        <image name="exam_record" width="351" height="120"/>
+        <image name="notice_unread" width="21" height="22"/>
+        <image name="record_detail" width="14" height="18"/>
+    </resources>
+</document>

+ 110 - 1
MusicGradeExam/MusicGradeExam/UI/NotiferMessage/Controller/NotifyMessageViewController.m

@@ -7,8 +7,12 @@
 //
 
 #import "NotifyMessageViewController.h"
+#import "MessageListModel.h"
+#import "NotifyMessageCell.h"
 
-@interface NotifyMessageViewController ()
+@interface NotifyMessageViewController ()<UITableViewDelegate, UITableViewDataSource>
+
+@property (nonatomic, strong) UITableView *tableView;
 
 @end
 
@@ -17,6 +21,111 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
+    [self allocTitle:@"通知中心"];
+    [self configUI];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self resetParamenter];
+    [self requestData];
+}
+
+
+- (void)requestData {
+    [self showhud];
+    [KSRequestManager sysMessageRequest:KS_GET page:[NSString stringWithFormat:@"%zd", self.pages] rows:[NSString stringWithFormat:@"%zd",self.rows] success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        [self.tableView.mj_header endRefreshing];
+        [self.tableView.mj_footer endRefreshing];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            // 赋值
+            NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
+            for (NSDictionary *parm in sourceArray) {
+                MessageListModel *model = [[MessageListModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+            [self.tableView reloadData];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+        [self changePromptLabelState];
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+        [self.tableView.mj_header endRefreshing];
+        [self.tableView.mj_footer endRefreshing];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.tableView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.tableView reloadData];
+        [self changePromptLabelState];
+    }];
+}
+
+
+- (void)configUI {
+    [self.view addSubview:self.tableView];
+    self.pages = 1;
+    self.rows = 10;
+    self.dataArray = [NSMutableArray array];
+    [self.tableView.mj_footer resetNoMoreData];
+    [self setPromptString:@"无内容" imageName:@"wd_img_zwsj" inView:self.tableView];
+    [self.tableView reloadData];
+}
+
+#pragma mark --- table data source
+#pragma mark --- table data soure
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    MessageListModel *model = self.dataArray[indexPath.row];
+    NotifyMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NotifyMessageCell"];
+    [cell configCellWithSource:model];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    
+}
+
+- (void)readMessage:(MessageListModel *)model baseCell:(NotifyMessageCell *)cell {
+    
+    [KSRequestManager sysMessageSetReadRequest:KS_POST messageId:[NSString stringWithFormat:@"%.0f", model.messageId] success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            model.readStatus = 1;
+            cell.isRead = YES;
+            // 跳转页面
+            
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+
+- (UITableView *)tableView {
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin) style:UITableViewStylePlain];
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.rowHeight = UITableViewAutomaticDimension;
+        _tableView.estimatedRowHeight = 88;
+        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        _tableView.backgroundColor = HexRGB(0xf3f4f8);
+        _tableView.showsVerticalScrollIndicator = NO;
+        [_tableView registerNib:[UINib nibWithNibName:@"NotifyMessageCell" bundle:nil] forCellReuseIdentifier:@"NotifyMessageCell"];
+        UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 10)];
+        bottomView.backgroundColor = HexRGB(0xf3f4f8);
+        _tableView.tableFooterView = bottomView;
+    }
+    return _tableView;
 }
 
 /*

+ 31 - 0
MusicGradeExam/MusicGradeExam/UI/NotiferMessage/Model/MessageListModel.h

@@ -0,0 +1,31 @@
+//
+//  MessageListModel.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/15.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+#import <Foundation/Foundation.h>
+
+
+@interface MessageListModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *content;
+@property (nonatomic, strong) NSString *modifyOn;
+@property (nonatomic, assign) double messageId;
+@property (nonatomic, strong) NSString *sendTime;
+@property (nonatomic, strong) NSString *receiver;
+@property (nonatomic, strong) NSString *errorMsg;
+@property (nonatomic, strong) NSString *createOn;
+@property (nonatomic, strong) NSString *memo;
+@property (nonatomic, strong) NSString *type;
+@property (nonatomic, strong) NSString *title;
+@property (nonatomic, assign) double userId;
+@property (nonatomic, assign) double readStatus;
+@property (nonatomic, strong) NSString *status;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 183 - 0
MusicGradeExam/MusicGradeExam/UI/NotiferMessage/Model/MessageListModel.m

@@ -0,0 +1,183 @@
+//
+//  MessageListModel.m
+//
+//  Created by   on 2019/10/10
+//  Copyright (c) 2019 __MyCompanyName__. All rights reserved.
+//
+
+#import "MessageListModel.h"
+
+
+NSString *const kMessageListModelContent = @"content";
+NSString *const kMessageListModelModifyOn = @"modifyOn";
+NSString *const kMessageListModelMessageId = @"id";
+NSString *const kMessageListModelSendTime = @"sendTime";
+NSString *const kMessageListModelReceiver = @"receiver";
+NSString *const kMessageListModelErrorMsg = @"errorMsg";
+NSString *const kMessageListModelCreateOn = @"createOn";
+NSString *const kMessageListModelMemo = @"memo";
+NSString *const kMessageListModelType = @"type";
+NSString *const kMessageListModelTitle = @"title";
+NSString *const kMessageListModelUserId = @"userId";
+NSString *const kMessageListModelReadStatus = @"readStatus";
+NSString *const kMessageListModelStatus = @"status";
+
+
+@interface MessageListModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MessageListModel
+
+@synthesize content = _content;
+@synthesize modifyOn = _modifyOn;
+@synthesize messageId = _messageId;
+@synthesize sendTime = _sendTime;
+@synthesize receiver = _receiver;
+@synthesize errorMsg = _errorMsg;
+@synthesize createOn = _createOn;
+@synthesize memo = _memo;
+@synthesize type = _type;
+@synthesize title = _title;
+@synthesize userId = _userId;
+@synthesize readStatus = _readStatus;
+@synthesize status = _status;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.content = [self objectOrNilForKey:kMessageListModelContent fromDictionary:dict];
+            self.modifyOn = [self objectOrNilForKey:kMessageListModelModifyOn fromDictionary:dict];
+            self.messageId = [[self objectOrNilForKey:kMessageListModelMessageId fromDictionary:dict] doubleValue];
+            self.sendTime = [self objectOrNilForKey:kMessageListModelSendTime fromDictionary:dict];
+            self.receiver = [self objectOrNilForKey:kMessageListModelReceiver fromDictionary:dict];
+            self.errorMsg = [self objectOrNilForKey:kMessageListModelErrorMsg fromDictionary:dict];
+            self.createOn = [self objectOrNilForKey:kMessageListModelCreateOn fromDictionary:dict];
+            self.memo = [self objectOrNilForKey:kMessageListModelMemo fromDictionary:dict];
+            self.type = [self objectOrNilForKey:kMessageListModelType fromDictionary:dict];
+            self.title = [self objectOrNilForKey:kMessageListModelTitle fromDictionary:dict];
+            self.userId = [[self objectOrNilForKey:kMessageListModelUserId fromDictionary:dict] doubleValue];
+            self.readStatus = [[self objectOrNilForKey:kMessageListModelReadStatus fromDictionary:dict] doubleValue];
+            self.status = [self objectOrNilForKey:kMessageListModelStatus fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.content forKey:kMessageListModelContent];
+    [mutableDict setValue:self.modifyOn forKey:kMessageListModelModifyOn];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.messageId] forKey:kMessageListModelMessageId];
+    [mutableDict setValue:self.sendTime forKey:kMessageListModelSendTime];
+    [mutableDict setValue:self.receiver forKey:kMessageListModelReceiver];
+    [mutableDict setValue:self.errorMsg forKey:kMessageListModelErrorMsg];
+    [mutableDict setValue:self.createOn forKey:kMessageListModelCreateOn];
+    [mutableDict setValue:self.memo forKey:kMessageListModelMemo];
+    [mutableDict setValue:self.type forKey:kMessageListModelType];
+    [mutableDict setValue:self.title forKey:kMessageListModelTitle];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.userId] forKey:kMessageListModelUserId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.readStatus] forKey:kMessageListModelReadStatus];
+    [mutableDict setValue:self.status forKey:kMessageListModelStatus];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.content = [aDecoder decodeObjectForKey:kMessageListModelContent];
+    self.modifyOn = [aDecoder decodeObjectForKey:kMessageListModelModifyOn];
+    self.messageId = [aDecoder decodeDoubleForKey:kMessageListModelMessageId];
+    self.sendTime = [aDecoder decodeObjectForKey:kMessageListModelSendTime];
+    self.receiver = [aDecoder decodeObjectForKey:kMessageListModelReceiver];
+    self.errorMsg = [aDecoder decodeObjectForKey:kMessageListModelErrorMsg];
+    self.createOn = [aDecoder decodeObjectForKey:kMessageListModelCreateOn];
+    self.memo = [aDecoder decodeObjectForKey:kMessageListModelMemo];
+    self.type = [aDecoder decodeObjectForKey:kMessageListModelType];
+    self.title = [aDecoder decodeObjectForKey:kMessageListModelTitle];
+    self.userId = [aDecoder decodeDoubleForKey:kMessageListModelUserId];
+    self.readStatus = [aDecoder decodeDoubleForKey:kMessageListModelReadStatus];
+    self.status = [aDecoder decodeObjectForKey:kMessageListModelStatus];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_content forKey:kMessageListModelContent];
+    [aCoder encodeObject:_modifyOn forKey:kMessageListModelModifyOn];
+    [aCoder encodeDouble:_messageId forKey:kMessageListModelMessageId];
+    [aCoder encodeObject:_sendTime forKey:kMessageListModelSendTime];
+    [aCoder encodeObject:_receiver forKey:kMessageListModelReceiver];
+    [aCoder encodeObject:_errorMsg forKey:kMessageListModelErrorMsg];
+    [aCoder encodeObject:_createOn forKey:kMessageListModelCreateOn];
+    [aCoder encodeObject:_memo forKey:kMessageListModelMemo];
+    [aCoder encodeObject:_type forKey:kMessageListModelType];
+    [aCoder encodeObject:_title forKey:kMessageListModelTitle];
+    [aCoder encodeDouble:_userId forKey:kMessageListModelUserId];
+    [aCoder encodeDouble:_readStatus forKey:kMessageListModelReadStatus];
+    [aCoder encodeObject:_status forKey:kMessageListModelStatus];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    MessageListModel *copy = [[MessageListModel alloc] init];
+    
+    if (copy) {
+
+        copy.content = [self.content copyWithZone:zone];
+        copy.modifyOn = [self.modifyOn copyWithZone:zone];
+        copy.messageId = self.messageId;
+        copy.sendTime = [self.sendTime copyWithZone:zone];
+        copy.receiver = [self.receiver copyWithZone:zone];
+        copy.errorMsg = [self.errorMsg copyWithZone:zone];
+        copy.createOn = [self.createOn copyWithZone:zone];
+        copy.memo = [self.memo copyWithZone:zone];
+        copy.type = [self.type copyWithZone:zone];
+        copy.title = [self.title copyWithZone:zone];
+        copy.userId = self.userId;
+        copy.readStatus = self.readStatus;
+        copy.status = [self.status copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 21 - 0
MusicGradeExam/MusicGradeExam/UI/NotiferMessage/View/NotifyMessageCell.h

@@ -0,0 +1,21 @@
+//
+//  NotifyMessageCell.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/15.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "MessageListModel.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NotifyMessageCell : UITableViewCell
+
+@property (nonatomic, assign) BOOL isRead; // 是否已读
+
+- (void)configCellWithSource:(MessageListModel *)sourceModel;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 55 - 0
MusicGradeExam/MusicGradeExam/UI/NotiferMessage/View/NotifyMessageCell.m

@@ -0,0 +1,55 @@
+//
+//  NotifyMessageCell.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/15.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "NotifyMessageCell.h"
+
+@interface NotifyMessageCell ()
+
+@property (weak, nonatomic) IBOutlet UIView *redDot;
+@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
+@property (weak, nonatomic) IBOutlet UILabel *topMessage;
+@property (weak, nonatomic) IBOutlet UILabel *descMessage;
+
+@property (nonatomic, strong) MessageListModel *model;
+
+@end
+
+@implementation NotifyMessageCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+- (void)configCellWithSource:(MessageListModel *)sourceModel {
+    self.model = sourceModel;
+    self.isRead = sourceModel.readStatus == 1 ? YES : NO;
+    NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
+    dateFormatter.timeZone = [NSTimeZone systemTimeZone];
+    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *messageDate = [dateFormatter dateFromString:sourceModel.createOn];
+    [dateFormatter setDateFormat:@"MM-dd"];
+    NSString *dateStr = [dateFormatter stringFromDate:messageDate];
+
+    self.timeLabel.text = [NSString returnNoNullStringWithString:dateStr];
+    self.topMessage.text = [NSString returnNoNullStringWithString:sourceModel.title];
+}
+
+- (void)setIsRead:(BOOL)isRead {
+    _isRead = isRead;
+    self.redDot.hidden = isRead;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 102 - 0
MusicGradeExam/MusicGradeExam/UI/NotiferMessage/View/NotifyMessageCell.xib

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="KGk-i7-Jjw" customClass="NotifyMessageCell">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="88"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="375" height="88"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="notify_image" translatesAutoresizingMaskIntoConstraints="NO" id="3zY-4P-qh6">
+                        <rect key="frame" x="16" y="23" width="42" height="42"/>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="42" id="cJa-q0-2jt"/>
+                            <constraint firstAttribute="height" constant="42" id="rpU-aC-QFM"/>
+                        </constraints>
+                    </imageView>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报名通知" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c4k-4Y-3yQ">
+                        <rect key="frame" x="76" y="23" width="66" height="22"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="22" id="7V8-Sq-Ogb"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="05-20" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iMh-Np-lvc">
+                        <rect key="frame" x="318" y="21" width="41" height="17"/>
+                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                        <color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="考生须带报考费及考生同一底版的…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yL7-lv-Cfl">
+                        <rect key="frame" x="76" y="48" width="265" height="21"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="21" id="81j-K6-dfj"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                        <color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pfN-a6-1ot">
+                        <rect key="frame" x="351" y="54.5" width="8" height="8"/>
+                        <color key="backgroundColor" red="1" green="0.20784313730000001" blue="0.20784313730000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="8" id="HDd-dc-azA"/>
+                            <constraint firstAttribute="height" constant="8" id="rqF-mm-I1Y"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="4"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yc7-s6-gbf">
+                        <rect key="frame" x="76" y="87" width="299" height="1"/>
+                        <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="1" id="2iG-Qy-b3T"/>
+                        </constraints>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="pfN-a6-1ot" secondAttribute="trailing" constant="16" id="383-7r-Vvj"/>
+                    <constraint firstItem="c4k-4Y-3yQ" firstAttribute="top" secondItem="3zY-4P-qh6" secondAttribute="top" id="38k-5F-MCl"/>
+                    <constraint firstItem="pfN-a6-1ot" firstAttribute="centerY" secondItem="yL7-lv-Cfl" secondAttribute="centerY" id="4jt-LR-LQI"/>
+                    <constraint firstItem="yL7-lv-Cfl" firstAttribute="top" secondItem="c4k-4Y-3yQ" secondAttribute="bottom" constant="3" id="Epb-qG-x8d"/>
+                    <constraint firstAttribute="trailing" secondItem="iMh-Np-lvc" secondAttribute="trailing" constant="16" id="GxV-jP-K9H"/>
+                    <constraint firstItem="c4k-4Y-3yQ" firstAttribute="leading" secondItem="3zY-4P-qh6" secondAttribute="trailing" constant="18" id="H2V-mf-agu"/>
+                    <constraint firstItem="3zY-4P-qh6" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="16" id="HvA-bz-WaR"/>
+                    <constraint firstItem="iMh-Np-lvc" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="21" id="P6e-WX-ZSp"/>
+                    <constraint firstItem="pfN-a6-1ot" firstAttribute="leading" secondItem="yL7-lv-Cfl" secondAttribute="trailing" constant="10" id="Prc-Dc-q8q"/>
+                    <constraint firstItem="3zY-4P-qh6" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="U2L-6a-Tf0"/>
+                    <constraint firstAttribute="trailing" secondItem="yc7-s6-gbf" secondAttribute="trailing" id="VbP-3S-iZ8"/>
+                    <constraint firstItem="yL7-lv-Cfl" firstAttribute="leading" secondItem="c4k-4Y-3yQ" secondAttribute="leading" id="iIJ-BA-JPW"/>
+                    <constraint firstAttribute="bottom" secondItem="yc7-s6-gbf" secondAttribute="bottom" id="rxs-5h-LdZ"/>
+                    <constraint firstItem="yc7-s6-gbf" firstAttribute="leading" secondItem="yL7-lv-Cfl" secondAttribute="leading" id="vOj-gj-6nV"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <connections>
+                <outlet property="descMessage" destination="yL7-lv-Cfl" id="oEO-dv-4xZ"/>
+                <outlet property="redDot" destination="pfN-a6-1ot" id="ylG-Yv-0hg"/>
+                <outlet property="timeLabel" destination="iMh-Np-lvc" id="S7h-0t-gex"/>
+                <outlet property="topMessage" destination="c4k-4Y-3yQ" id="HCw-4g-uK9"/>
+            </connections>
+            <point key="canvasLocation" x="-1" y="90"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="notify_image" width="42" height="42"/>
+    </resources>
+</document>