单击链接会冻结应用程序

Posted

技术标签:

【中文标题】单击链接会冻结应用程序【英文标题】:Clicking on link freezes the app 【发布时间】:2018-06-11 06:12:55 【问题描述】:

我正在使用Xamarin.TTTAttributedLabel 在 xamarin.ios 应用程序中解析 html。 大多数时候,每当我点击链接时,它都会冻结应用程序。有时它有效,有时则无效。 我在 UIView --> ScrollView 中使用 Label。我的滚动视图没有任何点击手势。 这不会发生在模拟器上。仅在物理设备上。

View.AddSubview (scrollView)
TTTAttributedLabel lbl = new TTTAttributedLabel();
lbl.SetText(attributedString, 15f);
lbl.Lines = 0;
lbl.EnabledTextCheckingTypes = NSTextCheckingType.Link | NSTextCheckingType.PhoneNumber;
lbl.UserInteractionEnabled = true;
lbl.Delegate = new TTTHTMLLabelDelegate(this);
lbl.Frame = new CGRect (15, 0, Common.screenWidth - 30, 20);
lbl.SizeToFit();
view2.AddSubview(lbl);
scrollView.AddSubview(view2);



//Delegate code
public override void DidSelectLinkWithURL(TTTAttributedLabel label, NSUrl url)
        
            if (url != null)
            
                var PageUrl = url.ToString();
                if (!string.IsNullOrWhiteSpace(PageUrl))
                
                    if (PageUrl.StartsWith("mailto"))
                    
                        //code to open email app
                    
                    else if (PageUrl.StartsWith("tel"))
                    
                       //code to open phone app

                    
                    else
                    
                        //for <a> links
                        UIApplication.SharedApplication.OpenUrl(url)
                    
                
            

        

已更新示例代码。 我还观察到一件事,DidSelectLinkWithURL 在应用冻结时不会被调用。

【问题讨论】:

我试图重现您的问题,但没有成功,您能给我们提供一个简单的演示吗? 嗨@ColeXia-MSFT,抱歉回复晚了。我已经添加了代码示例。看起来不错吗? 【参考方案1】:

尝试存储你的变量

public class YourClass

TTTAttributedLabel lbl;

 ViewDidLoad()
 
       View.AddSubview (scrollView)
       lbl = new TTTAttributedLabel();
       lbl.SetText(attributedString, 15f);
       lbl.Lines = 0;
       lbl.EnabledTextCheckingTypes = NSTextCheckingType.Link | 
       NSTextCheckingType.PhoneNumber;
       lbl.UserInteractionEnabled = true;
       lbl.Delegate = new TTTHTMLLabelDelegate(this);
       lbl.Frame = new CGRect (15, 0, Common.screenWidth - 30, 20);
       lbl.SizeToFit();
       view2.AddSubview(lbl);
       scrollView.AddSubview(view2);
 

【讨论】:

感谢@nikita。上周,我按照您的建议通过在班级级别声明标签解决了这个问题。在 ViewDidLoad() 内部初始化对我不起作用。所以我在构造函数内部进行了初始化,这为我解决了这个问题。还有一件事,如果你有一个 TTTAttributedLabel 数组,那么你必须初始化 single element。喜欢lbl[i] = new TTTAttributedLabel(); 只写lbl = new TTTAttributedLabel[SIZE] 是行不通的。 如果使用 [size] 初始化数组,所有元素都将获得其默认值。这就是为什么你应该初始化每个元素

以上是关于单击链接会冻结应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 向服务器发出请求会冻结 React Native 应用程序

单击嵌入式网络中的文本框时冻结的网络视图 - Android 4.3

在 Tkinter 中执行函数期间程序冻结

单击按钮后,ImGui 冻结

单击标题栏按钮时,全局低级鼠标钩子会导致冻结

当我单击任何内容时,我的 P2P 应用程序冻结