Objective-C & Swift 2.0 和“偏执”类
Posted
技术标签:
【中文标题】Objective-C & Swift 2.0 和“偏执”类【英文标题】:Objective-C & Swift 2.0 and "paranoic" Class 【发布时间】:2015-10-03 18:35:32 【问题描述】:在一个项目中,我使用 Objective-c 2.0-Swift2.0 和 XCode 7.0。
所以问题是: 我正在尝试将从 txt 文件中获取的一些字符串显示到 UiTextView 对象中。 另一个 Object-C 调用的捕获很好。 文件txt的读取很好
...但是将字符串放入 UITextView!返回我总是零。这是一个虚拟的工作,但是......它仍然不工作!
我尝试做与单个应用程序 Swift 文件相同的操作:它有效! p.s.请注意,我做了一个 IBoutlet 将 UIView 对象连接到 StoryBoard 到这个类。
这是代码,如果您需要更多详细信息,我很乐意提供。
import UIKit
@objc(TextControllerSwift) class TextControllerSwift: UIViewController
var textRoom: String?
var textPlaying: String?
@IBOutlet weak var textMuseum: UITextView!
override func viewDidLoad()
super.viewDidLoad()
realplay()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
func playText(textSelect: String)
//textSelect REturn a string value from another Object-C Class -See comments in the Segue add in.
textPlaying = textSelect
func realPlay()
let path = NSBundle.mainBundle().pathForResource(textPlaying, ofType:"txt")
if (path != nil)
//read the file
do
let textRoom = try NSString(contentsOfFile: path!, encoding: NSUTF8StringEncoding)
print(textRoom)
catch /* let's ignore when i didn't find file */
textMuseum!.text="pippo" //Nil
print(textMuseum!.text) //Nil
textMuseum.text=textMuseum.text.stringByAppendingString(String(textRoom)) //Nil
它给我 "致命错误:在展开可选值时意外发现 nil"
为什么?为什么?在同一个项目中,我调用了另一个 Swift 类,它工作得非常好。 (也就是我遵循了 Swift&Objective-C 类共存的指南) 非常感谢您的回答。
编辑: 添加了关于来自 Objective-C 的调用者的信息,也许这会有所帮助。
`if ([segue.identifier isEqualToString:@"segueIntroTesto"])
NSLog(@"%@ in segueIntroTesto" , selectedIntroFilm);
TextControllerSwift *destViewController = segue.destinationViewController;
[destViewController playText:selectedIntroFilm];
`
EDIT2::在 playText func 下删除 *self.viewDidLoad()*
。
EDIT3::将函数 playText()
拆分为另一个函数,以便让 XCode (uffff) 有时间获取新视图,然后我删除了旧的该死的 Outlet :D ...干杯我解决了谢谢
【问题讨论】:
如果设置断点并单步执行代码,哪一行会报错? 我把//Nil评论放在哪里...... 为什么self.viewDidLoad()
里面有playText
?删除它。根据我的经验,有时当您尝试使用IBOutlets
时,在viewDidLoad
内部它们仍然为零,请尝试在viewDidAppear
中使用
哦,我忘了删除它,因为我添加了“尝试”以获得一些想法。顺便说一句,结果是一样的。
【参考方案1】:
您的问题是您试图在加载视图之前设置插座的值。在填写 outlet 之前,为 segue 做准备。
将selectedIntroFilm
传递到控制器并在segue 期间将其保存为属性,然后稍后调用playText
...在viewDidLoad
或viewWillAppear
或任何对应用有意义的过程中。
【讨论】:
你的意思是TextControllerSwift
没有加载?这就是为什么我使用DidLoad
来尝试加载视图。正如我所做的DidLoad
应该不应该启动控制器吗?根据您的提示,所以我调用了一个新方法来存储selectedIntroFilm
,然后我调用DidLoad
和playText
在里面。它应该有效吗?我会试试的,谢谢你的想法。
它没有加载它的视图或它的出口。 您不必调用任何DidLoad
方法;操作系统会为您执行此操作。您只需决定加载完成后要执行的操作即可。
不工作......嗯,这是一个挑战。 2015-10-03 22:13:17.693 xxxxxx[3685:946750] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<TextControllerSwift 0x12e503a00> setValue:forUndefinedKey:]: **bold**this class is not key value coding-compliant for the key testo.'**bold** *** First throw call stack: ... libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
当我检查这个返回到“segue”执行时......然后开始启动 TextControllerSwift,我想......
不同的问题:您在故事板或 xib 中定义了一些名为 testo
的出口,而您的类中没有匹配的属性。
正确:...删除了原来的 Outlet,虽然我很惊讶。以上是关于Objective-C & Swift 2.0 和“偏执”类的主要内容,如果未能解决你的问题,请参考以下文章
开源 | Objective-C & Swift 最轻量级 Hook 方案
iOS复杂动画之抽丝剥茧(Objective-C & Swift)
initWithDictionary:在 Objective-C 和 Swift 中