Skip to content

Commit

Permalink
Site updated: 2016-11-30 10:16:30
Browse files Browse the repository at this point in the history
  • Loading branch information
yuntai01 authored and yuntai01 committed Nov 30, 2016
1 parent 014f821 commit 61277ce
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@
1- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
解决方法:
1、利用">
<meta property="og:updated_time" content="2016-11-30T02:13:52.000Z">
<meta property="og:updated_time" content="2016-11-30T02:16:21.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="iOS7中UITextField切换中文时某些协议方法无响应">
<meta name="twitter:description" content="UITextField切换中文输入,选中键盘中被mark的中文字符时,iOS7中UITextField不会调用如下协议方法:
Expand Down Expand Up @@ -354,7 +354,7 @@ <h1 class="post-title" itemprop="name headline">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;</div></pre></td></tr></table></figure>
<p>解决方法:</p>
<p>1、利用通知中心监听UITextFieldTextDidChangeNotification。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">[[NSNotificationCenter defaultCenter]addObserver:self</div><div class="line"> selector:@selector(textFiledEditChanged:)</div><div class="line"> name:UITextFieldTextDidChangeNotification</div><div class="line"> object:self];</div><div class="line"></div><div class="line">- (void)textFiledEditChanged:(NSNotification *)notification</div><div class="line">&#123;</div><div class="line"> if ([notification.object isKindOfClass:[EzvizTokenTextField class]]) &#123;</div><div class="line"> EzvizTokenTextField *textField = notification.object;</div><div class="line"></div><div class="line"> UITextRange *selectedRange = [textField markedTextRange];</div><div class="line"> //获取高亮部分</div><div class="line"> UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];</div><div class="line"> if (!position) &#123;</div><div class="line"></div><div class="line"> self.ezvizTokenTextFieldTextLength = [textField.text length];</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">[[NSNotificationCenter defaultCenter]addObserver:self</div><div class="line"> selector:@selector(textFiledEditChanged:)</div><div class="line"> name:UITextFieldTextDidChangeNotification</div><div class="line"> object:self];</div><div class="line"></div><div class="line">- (void)textFiledEditChanged:(NSNotification *)notification</div><div class="line">&#123;</div><div class="line"> if ([notification.object isKindOfClass:[EzvizTokenTextField class]]) &#123;</div><div class="line"> EzvizTokenTextField *textField = notification.object;</div><div class="line"> UITextRange *selectedRange = [textField markedTextRange];</div><div class="line"> //获取高亮部分</div><div class="line"> UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];</div><div class="line"> if (!position) &#123;</div><div class="line"> self.ezvizTokenTextFieldTextLength = [textField.text length];</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>当键盘中有mark的中文字符时,则根据UITextField实例方法markedTextRange可以获取开始位置以及长度,此时,只要没有选中被mark的字符时,textFiled.text 的 length是不会改变的。只有当选中被mark的字符时,markedTextRange返回的开始位置以及长度为0,则UITextPosition则为nil,此时说明textField.text 的 length改变。</p>
<p>2、通过KVO监听textField.text 的length。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">[self addObserver:self</div><div class="line"> forKeyPath:@&quot;ezvizTokenTextFieldTextLength&quot;</div><div class="line"> options:NSKeyValueObservingOptionNew</div><div class="line"> context:NULL];</div><div class="line"></div><div class="line">- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context</div><div class="line">&#123;</div><div class="line"> if (object == self &amp;&amp; [keyPath isEqualToString:@&quot;ezvizTokenTextFieldTextLength&quot;]) &#123;</div><div class="line"> //DDLogInfo(@&quot;ezvizTokenTextFieldTextLength: %d&quot;, self.ezvizTokenTextFieldTextLength);</div><div class="line"> if (self.ezvizTokenTextFieldTextLength) &#123;</div><div class="line"> if (delegate &amp;&amp; [delegate respondsToSelector:@selector(textFieldDidEndChanged:)]) &#123;</div><div class="line"> [delegate textFieldDidEndChanged:self];</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> else &#123;</div><div class="line"> [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>从而可以达到在iOS7下监听UITextField输入框内字符变化。</p>
Expand Down
2 changes: 1 addition & 1 deletion css/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -1682,7 +1682,7 @@ pre .javascript .function {
width: 4px;
height: 4px;
border-radius: 50%;
background: #ed75d5;
background: #2e4a65;
}
.links-of-blogroll {
font-size: 13px;
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ <h1 class="post-title" itemprop="name headline">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;</div></pre></td></tr></table></figure>
<p>解决方法:</p>
<p>1、利用通知中心监听UITextFieldTextDidChangeNotification。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">[[NSNotificationCenter defaultCenter]addObserver:self</div><div class="line"> selector:@selector(textFiledEditChanged:)</div><div class="line"> name:UITextFieldTextDidChangeNotification</div><div class="line"> object:self];</div><div class="line"></div><div class="line">- (void)textFiledEditChanged:(NSNotification *)notification</div><div class="line">&#123;</div><div class="line"> if ([notification.object isKindOfClass:[EzvizTokenTextField class]]) &#123;</div><div class="line"> EzvizTokenTextField *textField = notification.object;</div><div class="line"></div><div class="line"> UITextRange *selectedRange = [textField markedTextRange];</div><div class="line"> //获取高亮部分</div><div class="line"> UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];</div><div class="line"> if (!position) &#123;</div><div class="line"></div><div class="line"> self.ezvizTokenTextFieldTextLength = [textField.text length];</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">[[NSNotificationCenter defaultCenter]addObserver:self</div><div class="line"> selector:@selector(textFiledEditChanged:)</div><div class="line"> name:UITextFieldTextDidChangeNotification</div><div class="line"> object:self];</div><div class="line"></div><div class="line">- (void)textFiledEditChanged:(NSNotification *)notification</div><div class="line">&#123;</div><div class="line"> if ([notification.object isKindOfClass:[EzvizTokenTextField class]]) &#123;</div><div class="line"> EzvizTokenTextField *textField = notification.object;</div><div class="line"> UITextRange *selectedRange = [textField markedTextRange];</div><div class="line"> //获取高亮部分</div><div class="line"> UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];</div><div class="line"> if (!position) &#123;</div><div class="line"> self.ezvizTokenTextFieldTextLength = [textField.text length];</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>当键盘中有mark的中文字符时,则根据UITextField实例方法markedTextRange可以获取开始位置以及长度,此时,只要没有选中被mark的字符时,textFiled.text 的 length是不会改变的。只有当选中被mark的字符时,markedTextRange返回的开始位置以及长度为0,则UITextPosition则为nil,此时说明textField.text 的 length改变。</p>
<p>2、通过KVO监听textField.text 的length。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">[self addObserver:self</div><div class="line"> forKeyPath:@&quot;ezvizTokenTextFieldTextLength&quot;</div><div class="line"> options:NSKeyValueObservingOptionNew</div><div class="line"> context:NULL];</div><div class="line"></div><div class="line">- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context</div><div class="line">&#123;</div><div class="line"> if (object == self &amp;&amp; [keyPath isEqualToString:@&quot;ezvizTokenTextFieldTextLength&quot;]) &#123;</div><div class="line"> //DDLogInfo(@&quot;ezvizTokenTextFieldTextLength: %d&quot;, self.ezvizTokenTextFieldTextLength);</div><div class="line"> if (self.ezvizTokenTextFieldTextLength) &#123;</div><div class="line"> if (delegate &amp;&amp; [delegate respondsToSelector:@selector(textFieldDidEndChanged:)]) &#123;</div><div class="line"> [delegate textFieldDidEndChanged:self];</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> else &#123;</div><div class="line"> [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>从而可以达到在iOS7下监听UITextField输入框内字符变化。</p>
Expand Down

0 comments on commit 61277ce

Please sign in to comment.