Skip to content

Commit 7c9f1de

Browse files
committed
添加项目成员
1 parent 75ea0f2 commit 7c9f1de

9 files changed

Lines changed: 199 additions & 63 deletions

File tree

Coding_iOS.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,8 @@
370370
4E6CBE511D8E962300644086 /* TopicAnswerDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E6CBE501D8E962300644086 /* TopicAnswerDetailViewController.m */; };
371371
4E6CBE541D8EA9D100644086 /* icon_best_answer@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E6CBE521D8EA9D100644086 /* icon_best_answer@2x.png */; };
372372
4E6CBE551D8EA9D100644086 /* icon_best_answer@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E6CBE531D8EA9D100644086 /* icon_best_answer@3x.png */; };
373+
4E6CBE581D8FBDF500644086 /* messageProjectFans@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E6CBE561D8FBDF500644086 /* messageProjectFans@2x.png */; };
374+
4E6CBE591D8FBDF500644086 /* messageProjectFollows@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E6CBE571D8FBDF500644086 /* messageProjectFollows@2x.png */; };
373375
4E6D71891A75F00E005AD988 /* YLGIFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E6D71861A75F00E005AD988 /* YLGIFImage.m */; };
374376
4E6D718A1A75F00E005AD988 /* YLImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E6D71881A75F00E005AD988 /* YLImageView.m */; };
375377
4E6FB0551B5799B100B0A17B /* ProjectTag.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E6FB0541B5799B100B0A17B /* ProjectTag.m */; };
@@ -1700,6 +1702,8 @@
17001702
4E6CBE501D8E962300644086 /* TopicAnswerDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopicAnswerDetailViewController.m; sourceTree = "<group>"; };
17011703
4E6CBE521D8EA9D100644086 /* icon_best_answer@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_best_answer@2x.png"; sourceTree = "<group>"; };
17021704
4E6CBE531D8EA9D100644086 /* icon_best_answer@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_best_answer@3x.png"; sourceTree = "<group>"; };
1705+
4E6CBE561D8FBDF500644086 /* messageProjectFans@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "messageProjectFans@2x.png"; sourceTree = "<group>"; };
1706+
4E6CBE571D8FBDF500644086 /* messageProjectFollows@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "messageProjectFollows@2x.png"; sourceTree = "<group>"; };
17031707
4E6D71851A75F00E005AD988 /* YLGIFImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YLGIFImage.h; sourceTree = "<group>"; };
17041708
4E6D71861A75F00E005AD988 /* YLGIFImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YLGIFImage.m; sourceTree = "<group>"; };
17051709
4E6D71871A75F00E005AD988 /* YLImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YLImageView.h; sourceTree = "<group>"; };
@@ -3375,6 +3379,8 @@
33753379
4E6383B01B32640900D98648 /* message */ = {
33763380
isa = PBXGroup;
33773381
children = (
3382+
4E6CBE561D8FBDF500644086 /* messageProjectFans@2x.png */,
3383+
4E6CBE571D8FBDF500644086 /* messageProjectFollows@2x.png */,
33783384
4E6383B11B32640900D98648 /* messageAT@2x.png */,
33793385
4E6383B21B32640900D98648 /* messageComment@2x.png */,
33803386
4E6383B51B32640900D98648 /* messageSystem@2x.png */,
@@ -5890,6 +5896,7 @@
58905896
8EA6D1A819E240C40076D59C /* xtsegment_bordor_left@2x.png in Resources */,
58915897
4EB52F5C1C7C5C4F00B5EBEA /* task_resource_reference_MergeRequestBean@2x.png in Resources */,
58925898
8E525C8A19F7E3F800496B34 /* blankpage_image_loadFail@2x.png in Resources */,
5899+
4E6CBE591D8FBDF500644086 /* messageProjectFollows@2x.png in Resources */,
58935900
4E095A7E1B6B1E40008DC439 /* calendar_0xF24B4B@2x.png in Resources */,
58945901
4E5D13091C0ECB3400985AEB /* tweet_btn_comment@2x.png in Resources */,
58955902
4E095A6E1B69F920008DC439 /* banner__page_unselected@2x.png in Resources */,
@@ -6211,6 +6218,7 @@
62116218
D0C447A91C02A3C700DC1C4B /* task_normal@2x.png in Resources */,
62126219
4E96E7E41A1B537E0037C098 /* icon_file_xls@2x.png in Resources */,
62136220
4E2DB3491BA6AEB4002F27C4 /* coding_emoji_gif_04@2x.png in Resources */,
6221+
4E6CBE581D8FBDF500644086 /* messageProjectFans@2x.png in Resources */,
62146222
927AFF531BFF6DAD00AAE593 /* shop_nar_history_icon@3x.png in Resources */,
62156223
4EC461B41B39360F00D08970 /* file_changeType_MODIFY@2x.png in Resources */,
62166224
D0C447A71C02A3C700DC1C4B /* project_normal@2x.png in Resources */,

Coding_iOS/Controllers/AddUserViewController.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
#import "ProjectMember.h"
1212

1313
typedef NS_ENUM(NSInteger, AddUserType) {
14-
AddUserTypeProject = 0,
15-
AddUserTypeFollow
14+
AddUserTypeProjectRoot = 0,
15+
AddUserTypeProjectFollows,//我的关注
16+
AddUserTypeProjectFans,//我的粉丝
17+
AddUserTypeFollow//添加好友
1618
};
1719
@interface AddUserViewController : BaseViewController<UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate>
1820

1921
@property (assign, nonatomic) AddUserType type;
2022
@property (strong, nonatomic) Project *curProject;
2123
@property (copy, nonatomic) void(^popSelfBlock)();
22-
@property (strong, nonatomic) NSMutableArray *queryingArray, *addedArray, *searchedArray;
24+
@property (strong, nonatomic) NSMutableArray *queryingArray, *addedArray;
25+
@property (strong, nonatomic) NSArray *searchedArray;
2326
- (void)configAddedArrayWithMembers:(NSArray *)memberArray;
2427
@end

Coding_iOS/Controllers/AddUserViewController.m

Lines changed: 171 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,26 @@
1111
#import "UserCell.h"
1212
#import "UserInfoViewController.h"
1313
#import "Coding_NetAPIManager.h"
14+
#import "ToMessageCell.h"
15+
#import "ODRefreshControl.h"
16+
1417

1518
@interface AddUserViewController ()
1619
@property (strong, nonatomic) UISearchBar *mySearchBar;
1720
@property (strong, nonatomic) UITableView *myTableView;
21+
@property (strong, nonatomic) ODRefreshControl *myRefreshControl;
22+
@property (strong, nonatomic) Users *curUsers;
1823
@end
1924

2025
@implementation AddUserViewController
2126

2227
- (void)viewDidLoad {
2328
[super viewDidLoad];
2429
// Do any additional setup after loading the view.
25-
if (self.type == AddUserTypeProject) {
26-
self.title = @"添加成员";
30+
if (self.type < AddUserTypeFollow) {
31+
self.title = (self.type == AddUserTypeProjectRoot? @"添加成员":
32+
self.type == AddUserTypeProjectFollows? @"我的关注":
33+
@"我的粉丝");
2734
_queryingArray = [NSMutableArray array];
2835
_searchedArray = [NSMutableArray array];
2936
}else if (self.type == AddUserTypeFollow){
@@ -37,6 +44,7 @@ - (void)viewDidLoad {
3744
tableView.dataSource = self;
3845
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
3946
[tableView registerClass:[UserCell class] forCellReuseIdentifier:kCellIdentifier_UserCell];
47+
[tableView registerClass:[ToMessageCell class] forCellReuseIdentifier:kCellIdentifier_ToMessage];
4048
[self.view addSubview:tableView];
4149
[tableView mas_makeConstraints:^(MASConstraintMaker *make) {
4250
make.edges.equalTo(self.view);
@@ -51,11 +59,31 @@ - (void)viewDidLoad {
5159
searchBar;
5260
});
5361
_myTableView.tableHeaderView = _mySearchBar;
62+
if (self.type == AddUserTypeProjectFollows || self.type == AddUserTypeProjectFans) {
63+
_myRefreshControl = [[ODRefreshControl alloc] initInScrollView:self.myTableView];
64+
[_myRefreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];
65+
_curUsers = [Users usersWithOwner:[Login curLoginUser] Type:self.type == AddUserTypeProjectFollows? UsersTypeFriends_Attentive: UsersTypeFollowers];
66+
[self refresh];
67+
}
5468
}
5569

56-
- (void)didReceiveMemoryWarning {
57-
[super didReceiveMemoryWarning];
58-
// Dispose of any resources that can be recreated.
70+
- (void)refresh{
71+
if (_curUsers.isLoading) {
72+
return;
73+
}
74+
_curUsers.willLoadMore = NO;
75+
if (_curUsers.list.count <= 0) {
76+
[self.view beginLoading];
77+
}
78+
__weak typeof(self) weakSelf = self;
79+
[[Coding_NetAPIManager sharedManager] request_FollowersOrFriends_WithObj:self.curUsers andBlock:^(id data, NSError *error) {
80+
[weakSelf.myRefreshControl endRefreshing];
81+
[weakSelf.view endLoading];
82+
if (data) {
83+
[weakSelf.curUsers configWithObj:data];
84+
[weakSelf searchUserWithStr:weakSelf.mySearchBar.text];
85+
}
86+
}];
5987
}
6088

6189
- (void)viewDidDisappear:(BOOL)animated{
@@ -74,7 +102,9 @@ - (void)viewDidAppear:(BOOL)animated{
74102
}
75103

76104
- (void)configAddedArrayWithMembers:(NSArray *)memberArray{
77-
_addedArray = [NSMutableArray array];
105+
if (!_addedArray) {
106+
_addedArray = [NSMutableArray array];
107+
}
78108
for (ProjectMember *member in memberArray) {
79109
[_addedArray addObject:member.user];
80110
}
@@ -97,51 +127,72 @@ - (BOOL)userIsQuering:(User *)curUser{
97127
}
98128
#pragma mark Table M
99129
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
100-
return _searchedArray.count;
130+
if (self.type == AddUserTypeProjectRoot && _searchedArray.count == 0) {
131+
return 2;
132+
}else{
133+
return _searchedArray.count;
134+
}
101135
}
102136

103137
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
104-
__weak typeof(self) weakSelf = self;
105-
106-
UserCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier_UserCell forIndexPath:indexPath];
107-
User *curUser = [_searchedArray objectAtIndex:indexPath.row];
108-
cell.curUser = curUser;
109-
if (self.type == AddUserTypeProject) {
110-
cell.usersType = UsersTypeAddToProject;
111-
cell.isInProject = [self userIsInProject:curUser];
112-
cell.isQuerying = [self userIsQuering:curUser];
113-
cell.leftBtnClickedBlock = ^(User *clickedUser){
114-
NSLog(@"add %@ to pro:%@", clickedUser.name, weakSelf.curProject.name);
115-
if (![weakSelf userIsQuering:clickedUser]) {
116-
// 添加改用户到项目
117-
[weakSelf.queryingArray addObject:clickedUser];
118-
[weakSelf.myTableView reloadData];
119-
120-
[[Coding_NetAPIManager sharedManager] request_AddUser:clickedUser ToProject:weakSelf.curProject andBlock:^(id data, NSError *error) {
121-
if (data) {
122-
[weakSelf.addedArray addObject:clickedUser];
123-
}
124-
[weakSelf.queryingArray removeObject:clickedUser];
125-
[weakSelf.myTableView reloadData];
126-
}];
127-
}
128-
};
138+
if (self.type == AddUserTypeProjectRoot && _searchedArray.count == 0) {
139+
ToMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier_ToMessage forIndexPath:indexPath];
140+
cell.type = ToMessageTypeProjectFollows + indexPath.row;
141+
[tableView addLineforPlainCell:cell forRowAtIndexPath:indexPath withLeftSpace:kPaddingLeftWidth];
142+
return cell;
129143
}else{
130-
cell.usersType = UsersTypeAddFriend;
131-
cell.leftBtnClickedBlock = nil;
144+
__weak typeof(self) weakSelf = self;
145+
UserCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier_UserCell forIndexPath:indexPath];
146+
User *curUser = [_searchedArray objectAtIndex:indexPath.row];
147+
cell.curUser = curUser;
148+
if (self.type < AddUserTypeFollow) {
149+
cell.usersType = UsersTypeAddToProject;
150+
cell.isInProject = [self userIsInProject:curUser];
151+
cell.isQuerying = [self userIsQuering:curUser];
152+
cell.leftBtnClickedBlock = ^(User *clickedUser){
153+
NSLog(@"add %@ to pro:%@", clickedUser.name, weakSelf.curProject.name);
154+
if (![weakSelf userIsQuering:clickedUser]) {
155+
// 添加改用户到项目
156+
[weakSelf.queryingArray addObject:clickedUser];
157+
[weakSelf.myTableView reloadData];
158+
159+
[[Coding_NetAPIManager sharedManager] request_AddUser:clickedUser ToProject:weakSelf.curProject andBlock:^(id data, NSError *error) {
160+
if (data) {
161+
[weakSelf.addedArray addObject:clickedUser];
162+
}
163+
[weakSelf.queryingArray removeObject:clickedUser];
164+
[weakSelf.myTableView reloadData];
165+
}];
166+
}
167+
};
168+
}else{
169+
cell.usersType = UsersTypeAddFriend;
170+
cell.leftBtnClickedBlock = nil;
171+
}
172+
[tableView addLineforPlainCell:cell forRowAtIndexPath:indexPath withLeftSpace:60];
173+
return cell;
132174
}
133-
134-
[tableView addLineforPlainCell:cell forRowAtIndexPath:indexPath withLeftSpace:60];
135-
return cell;
136175
}
137176

138177
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
139-
return [UserCell cellHeight];
178+
if (self.type == AddUserTypeProjectRoot && _searchedArray.count == 0) {
179+
return [ToMessageCell cellHeight];
180+
}else{
181+
return [UserCell cellHeight];
182+
}
140183
}
141184

142185
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
143186
[tableView deselectRowAtIndexPath:indexPath animated:YES];
144-
[self goToUserInfo:[_searchedArray objectAtIndex:indexPath.row]];
187+
if (self.type == AddUserTypeProjectRoot && _searchedArray.count == 0) {
188+
AddUserViewController *vc = [AddUserViewController new];
189+
vc.curProject = _curProject;
190+
vc.type = AddUserTypeProjectFollows + indexPath.row;
191+
vc.addedArray = self.addedArray;
192+
[self.navigationController pushViewController:vc animated:YES];
193+
}else{
194+
[self goToUserInfo:[_searchedArray objectAtIndex:indexPath.row]];
195+
}
145196
}
146197

147198
- (void)goToUserInfo:(User *)user{
@@ -172,28 +223,91 @@ - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
172223
}
173224

174225
- (void)searchUserWithStr:(NSString *)string{
175-
NSString *strippedStr = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
176-
if (strippedStr.length > 0) {
177-
__weak typeof(self) weakSelf = self;
178-
[[Coding_NetAPIManager sharedManager] request_Users_WithSearchString:string andBlock:^(id data, NSError *error) {
179-
if (data) {
180-
weakSelf.searchedArray = data;
181-
[weakSelf.myTableView reloadData];
182-
}
183-
}];
226+
NSString *strippedStr = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
227+
if (self.type == AddUserTypeProjectRoot || self.type == AddUserTypeFollow) {
228+
if (strippedStr.length > 0) {
229+
__weak typeof(self) weakSelf = self;
230+
[[Coding_NetAPIManager sharedManager] request_Users_WithSearchString:string andBlock:^(id data, NSError *error) {
231+
if (data) {
232+
weakSelf.searchedArray = data;
233+
[weakSelf.myTableView reloadData];
234+
}
235+
}];
236+
}else{
237+
_searchedArray = nil;
238+
[_myTableView reloadData];
239+
}
184240
}else{
185-
[_searchedArray removeAllObjects];
186-
[_myTableView reloadData];
241+
if (strippedStr.length > 0) {
242+
[self updateFilteredContentForSearchString:strippedStr];
243+
}else{
244+
_searchedArray = _curUsers.list.copy;
245+
[_myTableView reloadData];
246+
}
187247
}
188-
189248
}
190249

191-
192-
- (void)dealloc
193-
{
194-
_myTableView.delegate = nil;
195-
_myTableView.dataSource = nil;
250+
- (void)updateFilteredContentForSearchString:(NSString *)searchString{
251+
// start out with the entire list
252+
NSMutableArray *searchResults = [self.curUsers.list mutableCopy];
253+
254+
// strip out all the leading and trailing spaces
255+
NSString *strippedStr = [searchString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
256+
257+
// break up the search terms (separated by spaces)
258+
NSArray *searchItems = nil;
259+
if (strippedStr.length > 0)
260+
{
261+
searchItems = [strippedStr componentsSeparatedByString:@" "];
262+
}
263+
264+
// build all the "AND" expressions for each value in the searchString
265+
NSMutableArray *andMatchPredicates = [NSMutableArray array];
266+
267+
for (NSString *searchString in searchItems)
268+
{
269+
// each searchString creates an OR predicate for: name, global_key
270+
NSMutableArray *searchItemsPredicate = [NSMutableArray array];
271+
272+
// name field matching
273+
NSExpression *lhs = [NSExpression expressionForKeyPath:@"name"];
274+
NSExpression *rhs = [NSExpression expressionForConstantValue:searchString];
275+
NSPredicate *finalPredicate = [NSComparisonPredicate
276+
predicateWithLeftExpression:lhs
277+
rightExpression:rhs
278+
modifier:NSDirectPredicateModifier
279+
type:NSContainsPredicateOperatorType
280+
options:NSCaseInsensitivePredicateOption];
281+
[searchItemsPredicate addObject:finalPredicate];
282+
// pinyinName field matching
283+
lhs = [NSExpression expressionForKeyPath:@"pinyinName"];
284+
rhs = [NSExpression expressionForConstantValue:searchString];
285+
finalPredicate = [NSComparisonPredicate
286+
predicateWithLeftExpression:lhs
287+
rightExpression:rhs
288+
modifier:NSDirectPredicateModifier
289+
type:NSContainsPredicateOperatorType
290+
options:NSCaseInsensitivePredicateOption];
291+
[searchItemsPredicate addObject:finalPredicate];
292+
// global_key field matching
293+
lhs = [NSExpression expressionForKeyPath:@"global_key"];
294+
rhs = [NSExpression expressionForConstantValue:searchString];
295+
finalPredicate = [NSComparisonPredicate
296+
predicateWithLeftExpression:lhs
297+
rightExpression:rhs
298+
modifier:NSDirectPredicateModifier
299+
type:NSContainsPredicateOperatorType
300+
options:NSCaseInsensitivePredicateOption];
301+
[searchItemsPredicate addObject:finalPredicate];
302+
// at this OR predicate to ourr master AND predicate
303+
NSCompoundPredicate *orMatchPredicates = (NSCompoundPredicate *)[NSCompoundPredicate orPredicateWithSubpredicates:searchItemsPredicate];
304+
[andMatchPredicates addObject:orMatchPredicates];
305+
}
306+
307+
NSCompoundPredicate *finalCompoundPredicate = (NSCompoundPredicate *)[NSCompoundPredicate andPredicateWithSubpredicates:andMatchPredicates];
308+
309+
self.searchedArray = [searchResults filteredArrayUsingPredicate:finalCompoundPredicate].copy;
310+
[self.myTableView reloadData];
196311
}
197312

198-
199313
@end

Coding_iOS/Controllers/ProjectViewController.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ - (void)navRightBtnClicked{
542542
__weak typeof(self) weakSelf = self;
543543
AddUserViewController *vc = [[AddUserViewController alloc] init];
544544
vc.curProject = self.myProject;
545-
vc.type = AddUserTypeProject;
545+
vc.type = AddUserTypeProjectRoot;
546546
if (_proMemberVC && _proMemberVC.myMemberArray) {
547547
[vc configAddedArrayWithMembers:_proMemberVC.myMemberArray];
548548
}
3.08 KB
Loading
2.91 KB
Loading

Coding_iOS/Views/Cell/MemberCell.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ - (void)setCurMember:(ProjectMember *)curMember{
117117
if (_curMember.user_id.intValue != [Login curLoginUser].id.integerValue) {//「私信」按钮
118118
// 别人
119119
[_leftBtn configPriMsgBtnWithUser:_curMember.user fromCell:YES];
120-
_leftBtn.hidden = NO;
120+
// _leftBtn.hidden = NO;
121+
_leftBtn.hidden = YES;//说是不要私信按钮了
121122
}else{
122123
// 自己
123124
if (_curMember.type.intValue == 100) {//项目创建者不能「退出」

Coding_iOS/Views/Cell/ToMessageCell.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
typedef NS_ENUM(NSInteger, ToMessageType) {
1313
ToMessageTypeAT = 0,
1414
ToMessageTypeComment,
15-
ToMessageTypeSystemNotification
15+
ToMessageTypeSystemNotification,
16+
ToMessageTypeProjectFollows,
17+
ToMessageTypeProjectFans,
1618
};
1719

1820
@interface ToMessageCell : UITableViewCell

0 commit comments

Comments
 (0)