UILabel 中的按钮/链接以切换到另一个 ViewController

Posted

技术标签:

【中文标题】UILabel 中的按钮/链接以切换到另一个 ViewController【英文标题】:Button/Link inside UILabel to switch to another ViewController 【发布时间】:2015-02-18 14:19:47 【问题描述】:

我想在我的 ios 应用中显示一些 Facebook 帖子。我从 Graph API 将整个帖子作为 JSON 对象获取。效果很好。

因此,如果用户发布新帖子并标记此帖子中的任何页面,则用户 ID(或页面 ID)也包含在该 JSON 对象中,为我提供文本内的偏移量和长度,这应该链接到该页面。 (听起来很奇怪,我举个例子):


  "id": "135416986571191_709831435796407", 
  "from": 
    "category": "Musician/band", 
    "name": "DANNIC", 
    "id": "135416986571191"
  , 
  "to": 
    "data": [
      
        "category": "Musician/band", 
        "name": "Tom & Jame", 
        "id": "423531801036780"
      , 
      
        "category": "Record label", 
        "name": "Revealed Recordings", 
        "id": "104563552952573"
      
    ]
  , 
  "message": "Wait For You (Tom & Jame Remix) is coming out in 2 days on Revealed Recordings!", 
  "message_tags": 
    "14": [
      
        "id": "423531801036780", 
        "name": "Tom & Jame", 
        "type": "page", 
        "offset": 14, 
        "length": 10
      
    ], 
    "59": [
      
        "id": "104563552952573", 
        "name": "Revealed Recordings", 
        "type": "page", 
        "offset": 59, 
        "length": 19
      
    ]
  , 
  "picture": "https://fbcdn-vthumb-a.akamaihd.net/hvthumb-ak-xfa1/v/t15.0-10/10876067_709831642463053_709831435796407_64260_924_b.jpg?oh=49c825ff152d98de125820093b5cff05&oe=5551397E&__gda__=1431085295_7c41923cf64cc0946a39e85b705ee691", 
    ....
    ....

如您所见,有“message_tags”,其中包含两个页面ID,即名称和偏移量长度。我想用 UIButton 或只是指向该页面的链接替换“消息”中的文本。我该怎么做?

这是该帖子在 Facebook 应用程序中的外观截图:

如您所见,“Tom & Jame”是可点击的,其余部分(“Revealed Recordings”除外)是普通文本。如果您点击“Tom & Jame”,它将切换到另一个视图控制器,显示它们的页面。这正是我在应用中想要的。

我知道我可以使用 NSAttributedText 作为标签,并使用 NSLinkAttributedName 使文本可点击。但我不希望我的应用切换到 safari 并打开 facebook 页面,我想留在我的应用中并切换到另一个 UIViewController,显示该页面的信息等。

即使我留在我的应用程序中,我也可以为该链接使用我的应用程序的 url 方案吗?或者我可以在该标签中放置一个 UIButton 并在我的视图控制器中处理点击吗?

什么是最好的解决方案?任何帮助表示赞赏! :)

【问题讨论】:

如果你想使用列表,那么表格视图可以派上用场,因为它有它的委托方法来选择表格单元格中的特定项目,或者如果 UI 不是面向列表的,那么在这种情况下你可以在 UIButton 中显示文本并为其添加操作。 我有一个带有自定义单元格的表格视图。该单元格包含一个 UILabel,其中包含几行“消息”。如果该帖子中链接了一个页面,我希望该页面是可点击的。你到底什么意思?我应该在 UILabel 里面放一个 UIButton 吗? 您是否尝试过使用表格“在索引路径处选择行”的委托方法,而不是在自定义单元格中使单个组件可clicable 为什么不在委托方法中编写导航代码?或者你已经试过了吗? 我想你不明白我的意思。让我编辑我的问题。 编辑了,希望你知道我现在想要什么。 【参考方案1】:

我要做的是将文本放入UITextView 并使用NSAttributedText。我会以稍后可以解析的方式构建 URL(足以让 UITextView 呈现链接,但它不必是 facebook 上的真实 URL)。

然后我将覆盖发送给UITextView 代表的shouldInteractWithURL。在这里,我可以重新解析 URL、检索数据并加载我的后续视图控制器。

看看这里的参考:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/UITextViewDelegate/textView:shouldInteractWithURL:inRange:

【讨论】:

我已经实现了 UITextView 和委托方法,似乎工作。唯一的事情是:如果我将文本视图中的链接检测设置为 true,它有时会使整个文本成为链接,而不仅仅是 URL 本身。如果我设置 'textView.attributedText = ...' 我的应用程序崩溃了? OK 忘了我说的,在使用 Swift 时似乎是 Xcode 中的一个错误。现在似乎可以工作了!

以上是关于UILabel 中的按钮/链接以切换到另一个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

轻按 UIButton 以切换到另一个 xib

尝试从 UIView 的按钮转移到另一个 ViewController 时,委托不起作用

单击按钮后如何切换到另一个 XML 布局?

无法从另一个视图控制器更改 UILabel 的文本

IOS/Swift:检查按钮图像以切换按钮图像

使用按钮单击将一个活动链接到另一个活动