草庐IT

ios - 继承 Objective-C 基类的 Swift 类未强制转换为正确的类型

coder 2023-09-17 原文

  • 使用 Xcode 7
  • swift 2

我一直在研究在 Swift UIViewController 中继承 Objective C 基类。我已经正确添加了我的桥接头文件,它是我项目build设置的正确部分:

在我的 SCS-Bridging-Header.h 文件中,我有以下代码:

#import "UIViewControllerPlus.h"

然后我尝试在 Swift 类中继承 Objective C 类 UIViewControllerPlus:

import UIKit

class TestBasicTabBarSegueViewController: UIViewControllerPlus {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

这会构建并运行,但是当我转到 Swift TestBasicTabBarSegueViewController 时,无法访问 Objective C 基类或父类(super class)的属性:

#ifndef UIViewControllerPlus_h
#define UIViewControllerPlus_h

#import <UIKit/UIKit.h>
#import "MMTabBarController.h"

@interface UIViewControllerPlus : UIViewController
@property MMTabBarController* mt;
@end

#endif /* UIViewControllerPlus_h */

它是 MMTabBarController 类型的属性 mt

您可以在以下自定义 Segue 中看到无法访问 destinationController.mt 并导致应用程序在尝试设置时崩溃:

#import "MMNavigationSegue.h"
#import "MMTabBarController.h"
#import "UIViewControllerPlus.h"

@implementation MMNavigationSegue

- (void) perform
{
    MMTabBarController *tabBarController = (MMTabBarController *) self.sourceViewController;
    UIViewControllerPlus *destinationController = (UIViewControllerPlus *) self.destinationViewController;
    destinationController.mt = tabBarController; //HERE APP CRASHES

    for (UIView *view in tabBarController.placeholderView.subviews)
    {
        [view removeFromSuperview];
    }

    // Add view to placeholder view
    tabBarController.currentViewController = destinationController;
    [tabBarController.placeholderView addSubview: destinationController.view];

    // Set autoresizing
    [tabBarController.placeholderView setTranslatesAutoresizingMaskIntoConstraints:NO];

    UIView *childview = destinationController.view; 
    [childview setTranslatesAutoresizingMaskIntoConstraints: NO];

    // fill horizontal
    [tabBarController.placeholderView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|[childview]|" options: 0 metrics: nil views: NSDictionaryOfVariableBindings(childview)]];

    // fill vertical
    [tabBarController.placeholderView addConstraints:[ NSLayoutConstraint constraintsWithVisualFormat: @"V:|-0-[childview]-0-|" options: 0 metrics: nil views: NSDictionaryOfVariableBindings(childview)]];

    [tabBarController.placeholderView layoutIfNeeded]; 

    // notify did move
    [destinationController didMoveToParentViewController: tabBarController];
}

@end

请注意,如果目标 UIViewController Segued 是继承自 Objective C 类 UIViewControllerPlus 的 Objective C 代码 UIViewController 实现,则上述代码有效。

但在下一行应用程序崩溃了:

错误:

2016-06-14 21:16:39.795 SCS[49747:17004544] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController setMt:]: unrecognized selector sent to instance 0x7d967080'

destinationController 没有转换为类型 UIViewControllerPlus,而是转换为类型 UIViewController,即使它定义为 UIViewControllerPlus。仅当它是继承 Objective C UIViewControllerPlus 类的 Swift 文件/类时才会发生这种情况,但如果它是继承 Objective C 基类 UIViewControllerPlus 的 Objective C 子类,则转换有效:

**可以在 Swift 中继承 Objective C 基类吗?我在网上阅读过关于此的各种相互矛盾的说法?

我的 Objective C 项目引用/配置中是否缺少某些内容?**

最佳答案

-[UIViewController setMt:]: 表示正在实例化的 View Controller 是常规 View Controller - 不是您的子类“plus”类型之一。

您可能忘记了将正确的类分配给 Storyboard中的 View Controller 。

关于ios - 继承 Objective-C 基类的 Swift 类未强制转换为正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37825865/

有关ios - 继承 Objective-C 基类的 Swift 类未强制转换为正确的类型的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. ruby-on-rails - Rails 单表继承 : How to override the value written to the type field - 2

    在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型

  5. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby-on-rails - 为什么 DataMapper 使用混合与继承? - 2

    所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass

  8. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

  9. ruby-on-rails - Ruby on Rails 单表继承(STI)和单元测试问题(使用 PostgreSQL) - 2

    我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户...8)错误:test_the_truth(用户测试):ActiveRecord::StatementInvalid:PGError:ERROR:关系“技术人员”不存在:从“技术人员”中删除...从本质上讲,标准框架不承认Technicians和Users表(或PostgreSQL称它们为“关系”)不存在,事实上,应该别名为Accounts。有什么想法吗?我对RoR比较陌生,不知道如何解决这个问题而又不完全删除STI。 最佳答案 原来问题是由于存在:./te

  10. ruby - 为什么 Ruby 模块继承不像类继承那样工作? - 2

    假设我有一个名为Flight的模块,其中包含类方法和实例方法。我可以使用include、extend或两者将其方法放入类中:classBatinclude会将Flight添加到Bat.ancestors,但extend不会。我的问题是,为什么模块与类不同?当我对Mammal进行子类化时,我总是同时获得类和实例方法。然而,当我混入一个模块时,我不能同时获得类和实例方法(除非我使用self.included钩子(Hook)或类似ActiveSupport::Concern的东西)。这种差异背后是否存在语言设计问题? 最佳答案 Modul

随机推荐