From ba3eef743e75557b9d0f222b971cf9bee6f8f492 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 30 Oct 2015 13:46:41 +0800 Subject: [PATCH 1/7] add LoadMoreTableViewCell --- Yep.xcodeproj/project.pbxproj | 16 ++++++++++ .../Feeds/FeedsViewController.swift | 14 +++++++- .../LoadMore/LoadMoreTableViewCell.swift | 26 +++++++++++++++ .../Cells/LoadMore/LoadMoreTableViewCell.xib | 32 +++++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift create mode 100644 Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index ff4e99f3..f159de87 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -242,6 +242,8 @@ 50D4D0DB1AFA825B005AEB6F /* MediaControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D4D0DA1AFA825B005AEB6F /* MediaControlView.swift */; }; 50DEE02C1BE209FF00015741 /* DeletedFeedConversationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DEE02A1BE209FF00015741 /* DeletedFeedConversationCell.swift */; }; 50DEE02D1BE209FF00015741 /* DeletedFeedConversationCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50DEE02B1BE209FF00015741 /* DeletedFeedConversationCell.xib */; }; + 50DEE0311BE339B000015741 /* LoadMoreTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DEE02F1BE339B000015741 /* LoadMoreTableViewCell.swift */; }; + 50DEE0321BE339B000015741 /* LoadMoreTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50DEE0301BE339B000015741 /* LoadMoreTableViewCell.xib */; }; 50E114F41ABBF9CC00F13000 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F31ABBF9CC00F13000 /* Models.swift */; }; 50E114F91ABC137A00F13000 /* YepServiceSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F81ABC137A00F13000 /* YepServiceSync.swift */; }; 50E114FC1ABC549300F13000 /* ContactsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114FA1ABC549300F13000 /* ContactsCell.swift */; }; @@ -555,6 +557,8 @@ 50D4D0DA1AFA825B005AEB6F /* MediaControlView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MediaControlView.swift; path = Views/Media/MediaControlView.swift; sourceTree = ""; }; 50DEE02A1BE209FF00015741 /* DeletedFeedConversationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DeletedFeedConversationCell.swift; path = Views/Cells/DeletedFeedConversation/DeletedFeedConversationCell.swift; sourceTree = ""; }; 50DEE02B1BE209FF00015741 /* DeletedFeedConversationCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = DeletedFeedConversationCell.xib; path = Views/Cells/DeletedFeedConversation/DeletedFeedConversationCell.xib; sourceTree = ""; }; + 50DEE02F1BE339B000015741 /* LoadMoreTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoadMoreTableViewCell.swift; path = Views/Cells/LoadMore/LoadMoreTableViewCell.swift; sourceTree = ""; }; + 50DEE0301BE339B000015741 /* LoadMoreTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoadMoreTableViewCell.xib; path = Views/Cells/LoadMore/LoadMoreTableViewCell.xib; sourceTree = ""; }; 50E114F31ABBF9CC00F13000 /* Models.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Realm/Models.swift; sourceTree = ""; }; 50E114F81ABC137A00F13000 /* YepServiceSync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepServiceSync.swift; path = Services/YepServiceSync.swift; sourceTree = ""; }; 50E114FA1ABC549300F13000 /* ContactsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ContactsCell.swift; path = Views/Cells/Contacts/ContactsCell.swift; sourceTree = ""; }; @@ -1078,6 +1082,7 @@ 502B60611BD112EA00D9C17E /* QuickPickPhotos */, 502B60661BD1209300D9C17E /* Camera */, 50E1CE901BE0BFF70025B933 /* MediaView */, + 50DEE0331BE339B600015741 /* LoadMore */, ); name = Cells; sourceTree = ""; @@ -1848,6 +1853,15 @@ name = DeletedFeedConversation; sourceTree = ""; }; + 50DEE0331BE339B600015741 /* LoadMore */ = { + isa = PBXGroup; + children = ( + 50DEE02F1BE339B000015741 /* LoadMoreTableViewCell.swift */, + 50DEE0301BE339B000015741 /* LoadMoreTableViewCell.xib */, + ); + name = LoadMore; + sourceTree = ""; + }; 50E114F51ABBF9D100F13000 /* Realm */ = { isa = PBXGroup; children = ( @@ -2255,6 +2269,7 @@ 5053AD5B1AF83B4200B3CBFA /* ChatLeftLocationCell.xib in Resources */, 0A8F54B81AB67D11004AD60E /* Images.xcassets in Resources */, 50EB8CC51AE89F12001AC1EE /* ChatRightVideoCell.xib in Resources */, + 50DEE0321BE339B000015741 /* LoadMoreTableViewCell.xib in Resources */, 502AE5191AB70D72005BD199 /* Intro.storyboard in Resources */, 502B60601BD112E500D9C17E /* QuickPickPhotosCell.xib in Resources */, 504BDC151B4528A500DBD35D /* Badges.xcassets in Resources */, @@ -2481,6 +2496,7 @@ 848806B61B7B4F53000C5424 /* ShowViewController.swift in Sources */, 5099B9C71AB99F7B002F940B /* RegisterPickAvatarViewController.swift in Sources */, 50E1CE8E1BE0BFF00025B933 /* MediaViewCell.swift in Sources */, + 50DEE0311BE339B000015741 /* LoadMoreTableViewCell.swift in Sources */, 504F41251ACE2D1D00FBB19A /* SampleView.swift in Sources */, 50A640EC1B6F4E420050E4A3 /* DoNotDisturbPeriodViewController.swift in Sources */, 502AE5291AB81076005BD199 /* YepService.swift in Sources */, diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 74c0bc8e..e5a6b1aa 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -71,6 +71,7 @@ class FeedsViewController: UIViewController { let feedSkillUsersCellID = "FeedSkillUsersCell" let feedCellID = "FeedCell" + let loadMoreTableViewCellID = "LoadMoreTableViewCell" lazy var noFeedsFooterView: InfoView = InfoView(NSLocalizedString("No Feeds.", comment: "")) @@ -177,6 +178,7 @@ class FeedsViewController: UIViewController { feedsTableView.registerNib(UINib(nibName: feedSkillUsersCellID, bundle: nil), forCellReuseIdentifier: feedSkillUsersCellID) feedsTableView.registerNib(UINib(nibName: feedCellID, bundle: nil), forCellReuseIdentifier: feedCellID) + feedsTableView.registerNib(UINib(nibName: loadMoreTableViewCellID, bundle: nil), forCellReuseIdentifier: loadMoreTableViewCellID) feedSortStyle = .Time } @@ -462,11 +464,12 @@ extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { enum Section: Int { case SkillUsers case Feed + case LoadMore } func numberOfSectionsInTableView(tableView: UITableView) -> Int { - return 2 + return 3 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { @@ -476,6 +479,8 @@ extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { return (skill == nil) ? 0 : 1 case Section.Feed.rawValue: return feeds.count + case Section.LoadMore.rawValue: + return feeds.isEmpty ? 0 : 1 default: return 0 } @@ -548,6 +553,10 @@ extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { return cell + case Section.LoadMore.rawValue: + let cell = tableView.dequeueReusableCellWithIdentifier(loadMoreTableViewCellID) as! LoadMoreTableViewCell + return cell + default: return UITableViewCell() } @@ -564,6 +573,9 @@ extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { let feed = feeds[indexPath.item] return heightOfFeed(feed) + case Section.LoadMore.rawValue: + return 60 + default: return 0 } diff --git a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift new file mode 100644 index 00000000..7c2b05b4 --- /dev/null +++ b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift @@ -0,0 +1,26 @@ +// +// LoadMoreTableViewCell.swift +// Yep +// +// Created by nixzhu on 15/10/30. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class LoadMoreTableViewCell: UITableViewCell { + + @IBOutlet weak var loadingActivityIndicator: UIActivityIndicatorView! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib new file mode 100644 index 00000000..9cc63980 --- /dev/null +++ b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c9abd8923646bc193a8eaeaf0b94158c784f9e31 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 30 Oct 2015 16:39:11 +0800 Subject: [PATCH 2/7] logic of load more feeds --- .../Feeds/FeedsViewController.swift | 30 ++++++++++++++++--- .../Cells/LoadMore/LoadMoreTableViewCell.xib | 3 +- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index e5a6b1aa..0556498b 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -220,8 +220,9 @@ class FeedsViewController: UIViewController { filterView.showInView(window) } } - - func updateFeeds(finish: (() -> Void)? = nil) { + + var currentPageIndex = 1 + func updateFeeds(isLoadMore isLoadMore: Bool = false, finish: (() -> Void)? = nil) { if let filterBarItem = filterBarItem { filterBarItem.title = feedSortStyle.nameWithArrow @@ -229,7 +230,14 @@ class FeedsViewController: UIViewController { activityIndicator.startAnimating() - discoverFeedsWithSortStyle(feedSortStyle, skill: skill, pageIndex: 1, perPage: 50, failureHandler: { reason, errorMessage in + if isLoadMore { + currentPageIndex++ + + } else { + currentPageIndex = 1 + } + + discoverFeedsWithSortStyle(feedSortStyle, skill: skill, pageIndex: currentPageIndex, perPage: 50, failureHandler: { reason, errorMessage in dispatch_async(dispatch_get_main_queue()) { [weak self] in self?.activityIndicator.stopAnimating() @@ -261,7 +269,13 @@ class FeedsViewController: UIViewController { dispatch_async(dispatch_get_main_queue()) { - strongSelf.feeds = feeds + if isLoadMore { + strongSelf.feeds += feeds + + } else { + strongSelf.feeds = feeds + } + strongSelf.feedsTableView.reloadData() // 服务端有新的排序算法,以及避免刷新后消息数字更新不及时的问题 // if newIndexPaths.count == allNewFeedSet.count { @@ -562,6 +576,14 @@ extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { } } + func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + + if indexPath.section == Section.LoadMore.rawValue { + + updateFeeds(isLoadMore: true) + } + } + func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { switch indexPath.section { diff --git a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib index 9cc63980..2870ee35 100644 --- a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib +++ b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib @@ -14,11 +14,10 @@ - + - From 1bd738004aa342f34d9dfb1c8f2f91f6f8de5859 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 30 Oct 2015 16:42:29 +0800 Subject: [PATCH 3/7] better change feedSortStyle --- Yep/ViewControllers/Feeds/FeedsViewController.swift | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 0556498b..a886afad 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -128,19 +128,13 @@ class FeedsViewController: UIViewController { var feedSortStyle: FeedSortStyle = .Default { didSet { - - feeds = [DiscoveredFeed]() - + feeds = [] feedsTableView.reloadData() - activityIndicator.startAnimating() - updateFeeds() } } - - var navigationControllerDelegate: ConversationMessagePreviewNavigationControllerDelegate? var originalNavigationControllerDelegate: UINavigationControllerDelegate? @@ -228,7 +222,9 @@ class FeedsViewController: UIViewController { filterBarItem.title = feedSortStyle.nameWithArrow } - activityIndicator.startAnimating() + if !isLoadMore { + activityIndicator.startAnimating() + } if isLoadMore { currentPageIndex++ From 3ee6000e3e9d905636b082692c959fbf935f5322 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 30 Oct 2015 16:48:53 +0800 Subject: [PATCH 4/7] when isFetchingFeeds; do not updateFeeds --- .../Feeds/FeedsViewController.swift | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index a886afad..57bb06e3 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -216,12 +216,19 @@ class FeedsViewController: UIViewController { } var currentPageIndex = 1 + var isFetchingFeeds = false func updateFeeds(isLoadMore isLoadMore: Bool = false, finish: (() -> Void)? = nil) { - + if let filterBarItem = filterBarItem { filterBarItem.title = feedSortStyle.nameWithArrow } + if isFetchingFeeds { + return + } + + isFetchingFeeds = true + if !isLoadMore { activityIndicator.startAnimating() } @@ -236,6 +243,9 @@ class FeedsViewController: UIViewController { discoverFeedsWithSortStyle(feedSortStyle, skill: skill, pageIndex: currentPageIndex, perPage: 50, failureHandler: { reason, errorMessage in dispatch_async(dispatch_get_main_queue()) { [weak self] in + + self?.isFetchingFeeds = false + self?.activityIndicator.stopAnimating() finish?() @@ -246,6 +256,9 @@ class FeedsViewController: UIViewController { }, completion: { [weak self] feeds in dispatch_async(dispatch_get_main_queue()) { [weak self] in + + self?.isFetchingFeeds = false + self?.activityIndicator.stopAnimating() finish?() From afdb83d57e8fd66f73086c364840ced7e0fc32fe Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 30 Oct 2015 16:51:49 +0800 Subject: [PATCH 5/7] set filterBarItem in didSet --- Yep/ViewControllers/Feeds/FeedsViewController.swift | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 57bb06e3..820d03e7 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -130,7 +130,9 @@ class FeedsViewController: UIViewController { didSet { feeds = [] feedsTableView.reloadData() - + + filterBarItem?.title = feedSortStyle.nameWithArrow + updateFeeds() } } @@ -219,10 +221,6 @@ class FeedsViewController: UIViewController { var isFetchingFeeds = false func updateFeeds(isLoadMore isLoadMore: Bool = false, finish: (() -> Void)? = nil) { - if let filterBarItem = filterBarItem { - filterBarItem.title = feedSortStyle.nameWithArrow - } - if isFetchingFeeds { return } From 22be319e19d333b7b81fd399c66264c07550a0a3 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 30 Oct 2015 16:55:16 +0800 Subject: [PATCH 6/7] hide separator line for load more cell --- Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift index 7c2b05b4..b6ae69fa 100644 --- a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift +++ b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.swift @@ -14,7 +14,8 @@ class LoadMoreTableViewCell: UITableViewCell { override func awakeFromNib() { super.awakeFromNib() - // Initialization code + + separatorInset = UIEdgeInsets(top: 0, left: UIScreen.mainScreen().bounds.width, bottom: 0, right: 0) } override func setSelected(selected: Bool, animated: Bool) { From a7b35b1c112522a291515d7b6195ced48299bc3e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 30 Oct 2015 17:18:51 +0800 Subject: [PATCH 7/7] logic of load more indicator animation; only have new feeds to reload feedsTableView --- .../Feeds/FeedsViewController.swift | 18 ++++++++++++++++-- .../Cells/LoadMore/LoadMoreTableViewCell.xib | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 820d03e7..f6c19eb3 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -283,7 +283,10 @@ class FeedsViewController: UIViewController { strongSelf.feeds = feeds } - strongSelf.feedsTableView.reloadData() // 服务端有新的排序算法,以及避免刷新后消息数字更新不及时的问题 + // 确保有新的才 reload + if !feeds.isEmpty { + strongSelf.feedsTableView.reloadData() // 服务端有新的排序算法,以及避免刷新后消息数字更新不及时的问题 + } // if newIndexPaths.count == allNewFeedSet.count { // strongSelf.updateFeedsTableViewOrInsertWithIndexPaths(newIndexPaths) @@ -587,7 +590,18 @@ extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { if indexPath.section == Section.LoadMore.rawValue { - updateFeeds(isLoadMore: true) + if let cell = cell as? LoadMoreTableViewCell { + + println("load more feeds") + + if !cell.loadingActivityIndicator.isAnimating() { + cell.loadingActivityIndicator.startAnimating() + } + + updateFeeds(isLoadMore: true, finish: { [weak cell] in + cell?.loadingActivityIndicator.stopAnimating() + }) + } } } diff --git a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib index 2870ee35..9c32df7b 100644 --- a/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib +++ b/Yep/Views/Cells/LoadMore/LoadMoreTableViewCell.xib @@ -14,7 +14,7 @@ - +