如何在Objective c xib类中导航视图控制器(快速制作)
Posted
技术标签:
【中文标题】如何在Objective c xib类中导航视图控制器(快速制作)【英文标题】:How to navigate a viewcontroller (which is made in swift) in Objective c xib class 【发布时间】:2017-05-10 09:46:28 【问题描述】:我正在使用 JSQMessagesViewController 库进行聊天。聊天可能包含网址。如果用户单击该 url,则该 url 将在 safari 中打开。
我想在我自己的具有 web 视图的视图控制器中打开 url。但我不知道如何在目标 c 中快速导航视图控制器。
- (BOOL)textView:(UITextView *)textView
shouldInteractWithURL:(NSURL *)URL
inRange:(NSRange)characterRange
interaction:(UITextItemInteraction)interaction
// Navigate to next VC
return NO;
提前谢谢你。
【问题讨论】:
【参考方案1】:但我不知道如何在目标 c 中导航视图控制器 这是快速制作的。
Use bridging header
让你的swift viewcontroller 在objective-c 代码中可见,然后你可以使用普通程序推送viewcontroller。
MySwiftVC *vc = [MySwiftVC init....];
vc.someProperty = Blah blah...;
[self.navigationController pushViewController:vc animated:true];
【讨论】:
我正在使用 JSQMessagesLibrary,我想在库中导航,但我该怎么做? 您需要对其进行子类化并覆盖在 Safari 中打开 url 的函数,并在任何地方使用自定义控件说CustomJSQMessagesLibrary
而不是 JSQMessagesLibrary
。【参考方案2】:
你需要在 Swift 和 Objective-c 之间架起一座桥梁,
在 swift 类中添加 @objc 定义如下:@objc class Abc
。
构建您的项目,以便 Xcode 可以自动为您生成桥接文件。
在objective-c文件中导入"YourProject-Swift.h"
现在您可以在 Objective-C 中调用 swift 类。 希望对您有所帮助。
【讨论】:
【参考方案3】:如果您想访问您的 Objective-C 类,您需要一个 Bridging header,您必须在其中导入您的 Objective-C 头文件。
如果你想在 Objective-C 中访问 Swift 类,你必须导入 swift.h,这是一个由 Xcode 自动生成的头文件,记住。您的 swift.h 文件的完整名称将是 (yourprojectname-Swift.h) 例如 Example-Swift.h
#import "yourprojectname-Swift.h"
现在您可以在 Objective-C 中访问您的 ViewController
现在您可以像使用 Objective-C 一样使用 swiftViewControllers
// Name of your Swift View Controller
YourSwiftViewController *yourSwiftVC = [[YourSwiftViewController alloc] init];
[self.navigationController pushViewController:yourSwiftVC animated:YES];
【讨论】:
我想在第三方库中执行此操作,为此我已经安装了 pod。 在这种情况下,第三方库必须具有您可以覆盖的功能,否则它可能会发布通知或某种块。还是它自己直接打开url而不通知你? 当我点击 url 时,它会自动在 safari 中打开 url。 我认为您必须查看那里的代表文档 [JSQMessagesCollectionViewCellDelegate 协议参考] (cocoadocs.org/docsets/JSQMessagesViewController/7.3.4/Protocols/…) 我不知道您如何保存您的网址,我在文档中没有找到任何内容的 JSQMessages 指出它们将打开任何视图。不要忘记他们也有 tableViewCells 的委托,你必须深入挖掘这些委托【参考方案4】:假设您的 swift ViewController 有一个 URL 变量,例如:
var url: URL!
和带有 url 的 loadRequest。
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
webView.loadRequest(URLRequest(url: url))
在 Objective-C 类中包含如下的 Swift 类引用
#import "<productName>-Swift.h"
在您的上下文中,Objective-C 控制器在处理 textView 时应该InteractWithURL
SwiftWebViewController *vc = [[SwiftWebViewController alloc] init];
vc.url = URL;
[self presentViewController:vc animated:YES completion:nil];
return NO;
【讨论】:
【参考方案5】:用于框架(例如 Cocoapods)
@import frameworkName
对于项目(例如手动拖动)
#import "projectName-Swift.h"
并使用它
【讨论】:
以上是关于如何在Objective c xib类中导航视图控制器(快速制作)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Objective-C 控制器中以编程方式加载用 swift 编写的自定义 XIB 视图
如何在 Tab bar 控制器中使用一个 Xib 并创建多个视图控制器? [目标-C]