From f4d6527d2a4f9be3c93f89b964ea88dfbf4e20e0 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 12 Jan 2016 09:48:00 +0800 Subject: [PATCH 1/7] optional avatarURLString in UsernamePrefixMatchedUser --- Yep/Services/YepService.swift | 10 ++++++---- Yep/Views/Mention/MentionView.swift | 6 +++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index c3aa60d1..61e52588 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -3695,7 +3695,7 @@ struct UsernamePrefixMatchedUser { let userID: String let username: String let nickname: String - let avatarURLString: String + let avatarURLString: String? var mentionUsername: String { return "@" + username @@ -3709,7 +3709,7 @@ func usersMatchWithUsernamePrefix(usernamePrefix: String, failureHandler: ((Reas ] let parse: JSONDictionary -> [UsernamePrefixMatchedUser]? = { data in - //println("usersMatchWithUsernamePrefix: \(data)") + println("usersMatchWithUsernamePrefix: \(data)") if let usersData = data["users"] as? [JSONDictionary] { let users: [UsernamePrefixMatchedUser] = usersData.map({ userInfo in @@ -3717,12 +3717,14 @@ func usersMatchWithUsernamePrefix(usernamePrefix: String, failureHandler: ((Reas userID = userInfo["id"] as? String, username = userInfo["username"] as? String, nickname = userInfo["nickname"] as? String, - avatarInfo = userInfo["avatar"] as? JSONDictionary, - avatarURLString = avatarInfo["thumb_url"] as? String + avatarInfo = userInfo["avatar"] as? JSONDictionary + //avatarURLString = avatarInfo["thumb_url"] as? String else { return nil } + let avatarURLString = avatarInfo["thumb_url"] as? String + return UsernamePrefixMatchedUser(userID: userID, username: username, nickname: nickname, avatarURLString: avatarURLString) }).flatMap({ $0 }) diff --git a/Yep/Views/Mention/MentionView.swift b/Yep/Views/Mention/MentionView.swift index 3aca2d11..a739b749 100644 --- a/Yep/Views/Mention/MentionView.swift +++ b/Yep/Views/Mention/MentionView.swift @@ -72,8 +72,12 @@ private class MentionUserCell: UITableViewCell { func configureWithUsernamePrefixMatchedUser(user: UsernamePrefixMatchedUser) { - let plainAvatar = PlainAvatar(avatarURLString: user.avatarURLString, avatarStyle: picoAvatarStyle) + if let avatarURLString = user.avatarURLString { + let plainAvatar = PlainAvatar(avatarURLString: avatarURLString, avatarStyle: picoAvatarStyle) avatarImageView.navi_setAvatar(plainAvatar, withFadeTransitionDuration: avatarFadeTransitionDuration) + } else { + avatarImageView.image = UIImage(named: "default_avatar_30") + } nicknameLabel.text = user.nickname mentionUsernameLabel.text = user.mentionUsername From 7adb431b3bebc45642ca02ef26d8d3bda687d3b4 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 12 Jan 2016 09:51:32 +0800 Subject: [PATCH 2/7] separatorInset --- Yep/Views/Mention/MentionView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Yep/Views/Mention/MentionView.swift b/Yep/Views/Mention/MentionView.swift index a739b749..248fa3da 100644 --- a/Yep/Views/Mention/MentionView.swift +++ b/Yep/Views/Mention/MentionView.swift @@ -109,6 +109,7 @@ class MentionView: UIView { let tableView = UITableView() tableView.backgroundColor = UIColor.clearColor() + tableView.separatorInset = UIEdgeInsets(top: 0, left: 60, bottom: 0, right: 0) let effect = UIBlurEffect(style: .ExtraLight) From 5ee7e41c88e5539376c780984ce3a23f67db797b Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 12 Jan 2016 10:24:41 +0800 Subject: [PATCH 3/7] wordInIndex for String --- Yep/Extensions/String+Yep.swift | 41 ++++++++++++++++++- Yep/Views/MessageToolbar/MessageToolbar.swift | 10 +++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Yep/Extensions/String+Yep.swift b/Yep/Extensions/String+Yep.swift index d0623b6d..f86bfa7b 100644 --- a/Yep/Extensions/String+Yep.swift +++ b/Yep/Extensions/String+Yep.swift @@ -20,6 +20,9 @@ extension String { return nil } } +} + +extension String { enum TrimmingType { case Whitespace @@ -34,4 +37,40 @@ extension String { return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) } } -} \ No newline at end of file +} + +extension String { + + func wordInIndex(index: Int) -> (string: String, range: Range)? { + + guard index > 0 else { + return nil + } + + let index = startIndex.advancedBy(index) + + var wordString: String? + var wordRange: Range? + + self.enumerateSubstringsInRange(Range(start: startIndex, end: endIndex), options: .ByWords) { (substring, substringRange, enclosingRange, stop) -> () in + + println("substring: \(substring)") + println("substringRange: \(substringRange)") + println("enclosingRange: \(enclosingRange)") + + if substringRange.contains(index) { + wordString = substring + wordRange = enclosingRange + stop = true + } + } + + guard let _wordString = wordString, _wordRange = wordRange else { + return nil + } + + return (_wordString, _wordRange) + } +} + + diff --git a/Yep/Views/MessageToolbar/MessageToolbar.swift b/Yep/Views/MessageToolbar/MessageToolbar.swift index 7338be81..d13a6da6 100644 --- a/Yep/Views/MessageToolbar/MessageToolbar.swift +++ b/Yep/Views/MessageToolbar/MessageToolbar.swift @@ -490,6 +490,15 @@ extension MessageToolbar: UITextViewDelegate { state = text.isEmpty ? .BeginTextInput : .TextInputing if needDetectMention { + + let range = textView.selectedRange + println("range: \(range)") + + if let (word, range) = text.wordInIndex(range.location - 1) { + println("word: \(word), \(range)") + } + + /* let parts = text.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) if let lastPart = parts.last { @@ -506,6 +515,7 @@ extension MessageToolbar: UITextViewDelegate { } giveUpMentionUserAction?() + */ } } } From a992f0e5af82655938e92a0f663a60a920963830 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 12 Jan 2016 10:46:48 +0800 Subject: [PATCH 4/7] new logic get mentionWord --- Yep/Extensions/String+Yep.swift | 2 +- Yep/Views/MessageToolbar/MessageToolbar.swift | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Yep/Extensions/String+Yep.swift b/Yep/Extensions/String+Yep.swift index f86bfa7b..cd328318 100644 --- a/Yep/Extensions/String+Yep.swift +++ b/Yep/Extensions/String+Yep.swift @@ -52,7 +52,7 @@ extension String { var wordString: String? var wordRange: Range? - self.enumerateSubstringsInRange(Range(start: startIndex, end: endIndex), options: .ByWords) { (substring, substringRange, enclosingRange, stop) -> () in + self.enumerateSubstringsInRange(Range(start: startIndex, end: endIndex), options: [.ByWords, .Reverse]) { (substring, substringRange, enclosingRange, stop) -> () in println("substring: \(substring)") println("substringRange: \(substringRange)") diff --git a/Yep/Views/MessageToolbar/MessageToolbar.swift b/Yep/Views/MessageToolbar/MessageToolbar.swift index d13a6da6..de7201d6 100644 --- a/Yep/Views/MessageToolbar/MessageToolbar.swift +++ b/Yep/Views/MessageToolbar/MessageToolbar.swift @@ -491,13 +491,28 @@ extension MessageToolbar: UITextViewDelegate { if needDetectMention { - let range = textView.selectedRange - println("range: \(range)") + let currentLetterIndex = textView.selectedRange.location - 1 - if let (word, range) = text.wordInIndex(range.location - 1) { - println("word: \(word), \(range)") + if let (wordString, wordRange) = text.wordInIndex(currentLetterIndex) { + println("word: \(wordString), \(wordRange)") + + if wordRange.startIndex != text.startIndex { + let mentionWordRange = Range(start: wordRange.startIndex.advancedBy(-1), end: wordRange.endIndex) + + let mentionWord = text.substringWithRange(mentionWordRange) + + if mentionWord.hasPrefix("@") { + + mentionUsernameRange = mentionWordRange + tryMentionUserAction?(usernamePrefix: wordString) + + return + } + } } + giveUpMentionUserAction?() + /* let parts = text.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) From 71a5185cfdd2138d549b7989cd630ba88e1b593b Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 12 Jan 2016 10:58:09 +0800 Subject: [PATCH 5/7] perfect logic for mentionWordInIndex --- Yep/Extensions/String+Yep.swift | 19 +++++++++++++++---- Yep/Views/MessageToolbar/MessageToolbar.swift | 19 +++++-------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Yep/Extensions/String+Yep.swift b/Yep/Extensions/String+Yep.swift index cd328318..a1a8a696 100644 --- a/Yep/Extensions/String+Yep.swift +++ b/Yep/Extensions/String+Yep.swift @@ -41,7 +41,7 @@ extension String { extension String { - func wordInIndex(index: Int) -> (string: String, range: Range)? { + func mentionWordInIndex(index: Int) -> (wordString: String, mentionWordRange: Range)? { guard index > 0 else { return nil @@ -60,7 +60,7 @@ extension String { if substringRange.contains(index) { wordString = substring - wordRange = enclosingRange + wordRange = substringRange stop = true } } @@ -69,8 +69,19 @@ extension String { return nil } - return (_wordString, _wordRange) + guard _wordRange.startIndex != startIndex else { + return nil + } + + let mentionWordRange = Range(start: _wordRange.startIndex.advancedBy(-1), end: _wordRange.endIndex) + + let mentionWord = substringWithRange(mentionWordRange) + + guard mentionWord.hasPrefix("@") else { + return nil + } + + return (_wordString, mentionWordRange) } } - diff --git a/Yep/Views/MessageToolbar/MessageToolbar.swift b/Yep/Views/MessageToolbar/MessageToolbar.swift index de7201d6..c2004b3f 100644 --- a/Yep/Views/MessageToolbar/MessageToolbar.swift +++ b/Yep/Views/MessageToolbar/MessageToolbar.swift @@ -493,22 +493,13 @@ extension MessageToolbar: UITextViewDelegate { let currentLetterIndex = textView.selectedRange.location - 1 - if let (wordString, wordRange) = text.wordInIndex(currentLetterIndex) { - println("word: \(wordString), \(wordRange)") + if let (wordString, mentionWordRange) = text.mentionWordInIndex(currentLetterIndex) { + println("mentionWord: \(wordString), \(mentionWordRange)") - if wordRange.startIndex != text.startIndex { - let mentionWordRange = Range(start: wordRange.startIndex.advancedBy(-1), end: wordRange.endIndex) + mentionUsernameRange = mentionWordRange + tryMentionUserAction?(usernamePrefix: wordString) - let mentionWord = text.substringWithRange(mentionWordRange) - - if mentionWord.hasPrefix("@") { - - mentionUsernameRange = mentionWordRange - tryMentionUserAction?(usernamePrefix: wordString) - - return - } - } + return } giveUpMentionUserAction?() From 14190cb93023d888e0db764bd449cc9e1d4f5d8c Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 12 Jan 2016 10:59:25 +0800 Subject: [PATCH 6/7] clean code --- Yep/Extensions/String+Yep.swift | 8 +++---- Yep/Views/MessageToolbar/MessageToolbar.swift | 23 ++----------------- 2 files changed, 6 insertions(+), 25 deletions(-) diff --git a/Yep/Extensions/String+Yep.swift b/Yep/Extensions/String+Yep.swift index a1a8a696..6d7d1ec5 100644 --- a/Yep/Extensions/String+Yep.swift +++ b/Yep/Extensions/String+Yep.swift @@ -41,7 +41,7 @@ extension String { extension String { - func mentionWordInIndex(index: Int) -> (wordString: String, mentionWordRange: Range)? { + func yep_mentionWordInIndex(index: Int) -> (wordString: String, mentionWordRange: Range)? { guard index > 0 else { return nil @@ -54,9 +54,9 @@ extension String { self.enumerateSubstringsInRange(Range(start: startIndex, end: endIndex), options: [.ByWords, .Reverse]) { (substring, substringRange, enclosingRange, stop) -> () in - println("substring: \(substring)") - println("substringRange: \(substringRange)") - println("enclosingRange: \(enclosingRange)") + //println("substring: \(substring)") + //println("substringRange: \(substringRange)") + //println("enclosingRange: \(enclosingRange)") if substringRange.contains(index) { wordString = substring diff --git a/Yep/Views/MessageToolbar/MessageToolbar.swift b/Yep/Views/MessageToolbar/MessageToolbar.swift index c2004b3f..190f5d41 100644 --- a/Yep/Views/MessageToolbar/MessageToolbar.swift +++ b/Yep/Views/MessageToolbar/MessageToolbar.swift @@ -493,8 +493,8 @@ extension MessageToolbar: UITextViewDelegate { let currentLetterIndex = textView.selectedRange.location - 1 - if let (wordString, mentionWordRange) = text.mentionWordInIndex(currentLetterIndex) { - println("mentionWord: \(wordString), \(mentionWordRange)") + if let (wordString, mentionWordRange) = text.yep_mentionWordInIndex(currentLetterIndex) { + //println("mentionWord: \(wordString), \(mentionWordRange)") mentionUsernameRange = mentionWordRange tryMentionUserAction?(usernamePrefix: wordString) @@ -503,25 +503,6 @@ extension MessageToolbar: UITextViewDelegate { } giveUpMentionUserAction?() - - /* - let parts = text.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) - - if let lastPart = parts.last { - if lastPart.hasPrefix("@") { - let usernamePrefix = lastPart.substringFromIndex(lastPart.startIndex.advancedBy(1)) - - if !usernamePrefix.isEmpty { - mentionUsernameRange = text.rangeOfString(lastPart) - tryMentionUserAction?(usernamePrefix: usernamePrefix) - - return - } - } - } - - giveUpMentionUserAction?() - */ } } } From e215bbc5d7c072f9aee9a35758f4a3604038476f Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 12 Jan 2016 11:02:47 +0800 Subject: [PATCH 7/7] updateHeightOfMessageTextView after replaceMentionedUsername --- Yep/Views/MessageToolbar/MessageToolbar.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Yep/Views/MessageToolbar/MessageToolbar.swift b/Yep/Views/MessageToolbar/MessageToolbar.swift index 190f5d41..314af2e5 100644 --- a/Yep/Views/MessageToolbar/MessageToolbar.swift +++ b/Yep/Views/MessageToolbar/MessageToolbar.swift @@ -441,6 +441,8 @@ class MessageToolbar: UIToolbar { text.replaceRange(range, with: mentionUsernameWithSpaceSuffix) messageTextView.text = text + + updateHeightOfMessageTextView() } }