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...在viewDidLoadviewWillAppear 或任何对应用有意义的过程中。

【讨论】:

你的意思是TextControllerSwift 没有加载?这就是为什么我使用DidLoad 来尝试加载视图。正如我所做的DidLoad 应该不应该启动控制器吗?根据您的提示,所以我调用了一个新方法来存储selectedIntroFilm,然后我调用DidLoadplayText 在里面。它应该有效吗?我会试试的,谢谢你的想法。 它没有加载它的视图或它的出口。 您不必调用任何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 中

浅谈Swift 2中的Objective-C指针

将 Objective-C 代码迁移到 Swift(Swift 2.0更新)-b

Swift互用性: 使用Objective-C特性编写Swift类(Swift 2.0版)-b