当弹出框被解除时,保持 UITextView 中的文本突出显示

Posted

技术标签:

【中文标题】当弹出框被解除时,保持 UITextView 中的文本突出显示【英文标题】:Keep text in UITextView highlighted when the popover is dismissed 【发布时间】:2015-04-27 12:58:54 【问题描述】:

我有一个 UIPopover,它显示了一个包含填充一些文本的 UITextView 的普通视图。我设法突出显示文本。当弹出窗口被关闭并重新打开时,突出显示消失。即使应用程序关闭,我也想保持文本突出显示。有什么想法可以实现吗?我使用的代码如下:

    - (void)highlight 

         NSRange selectedRange = self.textViewAll.selectedRange;

         NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]
                                                        initWithAttributedString:self.textViewAll.attributedText];

         [attributedString addAttribute:NSForegroundColorAttributeName
                                  value:[UIColor redColor]
                                  range:selectedRange];

       //  [highlightedRange addObject:];
// This is where i tried to save each location and length in a mutable array but didn't work
         [highlightedRangeLocation insertObject:[NSNumber numberWithInteger:selectedRange.location] atIndex:indexOfHighlight];
         [highlightedRangeLength insertObject:[NSNumber numberWithInteger:selectedRange.length] atIndex:indexOfHighlight];

///////////////////////////////////////////////////////////////////////////////
         self.textViewAll.attributedText = attributedString;

         indexOfHighlight ++ ;
    
    - (void)viewDidLoad 
         UIMenuItem *highlightMenuItem = [[UIMenuItem alloc] initWithTitle:@"Highlight" action:@selector(highlight)];
         [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:highlightMenuItem]];

         float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];

         if (sysVer >= 8.0) 
              self.textViewAll.layoutManager.allowsNonContiguousLayout = NO;
         


         

谁能指出如何从这里继续?

编辑 1:

关闭弹窗的代码:

- (IBAction)closeFun:(id)sender 

  //   self.popoverPresentationController set

[self dismissViewControllerAnimated:YES completion:nil];
    // [self dismis]


【问题讨论】:

【参考方案1】:

你不能在弹出框消失时将突出显示的文本范围保存在 [NSUserDefaults standardUserDefaults] 中,并在弹出框重新出现时检索它吗?

【讨论】:

这是最好的方法 :) 最方便的方法...恭喜获得赏金!【参考方案2】:

我认为问题在于弹出框负责突出显示的状态,即,保留该事实/状态的是弹出框。 弹出框是表示层/用户界面的一部分。当然,亮点代表了一些事实(现在是关键) - 完全独立于弹出框。

例如,突出显示一项任务可能表示该任务已到期。或者,将标签突出显示为红色可能意味着银行中的余额为负数。 您会看到,无论您使用什么用户界面元素,它们都只代表一些潜在的业务现实。 但是您创建一个弹出框实例可能会发生什么,您将它设置为具有突出显示的元素。但是,当它关闭时,这个具体的弹出框实例会死掉

亮点也随之消亡。

当你点击某个按钮(我猜)时,会出现一个弹出框,但它是一个不同的实例。这个实例不知道高亮。 即使您以某种方式设法使弹出框的一个实例保持活动状态,并且只是隐藏并再次显示它,弹出框也不应该负责知道某些东西是红色还是到期,(因此突出显示。)

在您的应用程序中,您应该有一个分离良好的模型层...它基本上是一组表示状态的相关对象,即。与应用程序从业务角度解决的问题相关的事实(例如,画线、计算兴趣..存储音乐..任何事情)。这个模型层,其中的一些对象,应该存储事实......即。任务到期,或余额不足。

每次显示弹出框时,您都应该在显示弹出框时调查模型层中的基本事实。调查意味着找到一种程序化的方式来查看模型对象,找出那里的值,并基于这个“调查”再次设置那个时刻的亮点。您不应该依赖它在不远的过去突出显示的事实。

【讨论】:

感谢您的回答,您是绝对正确的.. 但由于我现在面临这个问题,我需要找到任何解决方案以使其真正发挥作用!能否请您指导我学习教程或任何可以真正帮助我学习并将我导航到正确位置的代码 sn-p? 那么在这种情况下,在接口类扩展中创建一个私有弹出框属性,显式地为该属性实现 getter,延迟初始化弹出框,然后显示和隐藏它。由于您将一遍又一遍地显示和隐藏同一个实例,因此它将保持其状态,即内部的任何内容都将保持突出显示。 我需要一个代码更改解决方案......如果你能帮助我,我保证你会得到赏金......我将非常感激......这是过去几次的噩梦天! 你能告诉我突出显示的代码部分吗? 这不是对文本进行任何突出显示。这纯粹是在关闭呈现的视图控制器。

以上是关于当弹出框被解除时,保持 UITextView 中的文本突出显示的主要内容,如果未能解决你的问题,请参考以下文章

iOS弹出框如何去除阴影

如何检测弹出框关闭

移动时附加到 UICollectionView 中的单元格的弹出框被称为此集合视图的 ReloadData

ipad 检测 UIPopoverController 何时被解除

初始化后直接释放内容视图控制器的弹出框

bootstrap modal 弹出框被遮挡