无法将类型“(MapViewController).Type”(又名“MapViewController.Type”)的值转换为预期的参数类型“UIView”

Posted

技术标签:

【中文标题】无法将类型“(MapViewController).Type”(又名“MapViewController.Type”)的值转换为预期的参数类型“UIView”【英文标题】:Cannot convert value of type '(MapViewController).Type' (aka 'MapViewController.Type') to expected argument type 'UIView' 【发布时间】:2016-08-02 20:28:04 【问题描述】:

我想添加子视图时遇到此错误。正如您可以在出现错误的代码中看到的那样。我是 编程方面相对较新,所以我需要帮助。我正在用 Swift 编写,没有使用故事板。

忽略我写的地方:backgroundColor = UIColor.blueColor()

编辑:我忘了提到我知道是什么导致了错误。我知道 MapViewController 是 UIViewController,我把它放在 UIView 中。但我不知道如何解决。

我想要的是将mapview 添加到单个单元格

import UIKit
import MapKit

class MapCell1: MapCell, MKMapViewDelegate 



override func setupViews() 

    backgroundColor = UIColor.blueColor()

    addSubview(MapViewController) //Cannot convert value of type '(MapViewController).Type' (aka 'MapViewController.Type') to expected argument type 'UIView'







import UIKit

import MapKit

class MapViewController: UIViewController 

var window: UIWindow?
var mapView: MKMapView?

override func viewDidLoad() 
    super.viewDidLoad()

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.view.backgroundColor = UIColor.whiteColor()

    self.mapView = MKMapView(frame: CGRectMake(0, 20, (self.window?.frame.width)!, 300))
    self.view.addSubview(self.mapView!)





这是 MapCell 的代码:

import UIKit


class MapCell: BaseCell, UICollectionViewDelegate 

    let collectionView: UICollectionView = 
    let layout = UICollectionViewFlowLayout()
    let cv = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
    cv.backgroundColor = UIColor.redColor()
    return cv
()


        let cellId = "cellId"

override func setupViews() 
    super.setupViews()

    addSubview(collectionView)
    addconstraintsWithFormat("H:|[v0]|", views: collectionView)
    addconstraintsWithFormat("V:|[v0]|", views: collectionView)









And BaseCell: 

mport UIKit

class BaseCell: UICollectionViewCell 
    override init(frame: CGRect) 
    super.init(frame: frame)
    setupViews()


func setupViews() 



required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")



class BaseCell: UICollectionViewCell 


    func setupViews() 


    







Here is the new error

【问题讨论】:

MapViewController 是一个视图控制器...您正在尝试将其添加到视图中...我不确定您是否正在尝试这样做 是的,我正在尝试这样做。 您不能将视图控制器添加到您的视图中。您可以将视图添加到视图或将视图添加到视图控制器 【参考方案1】:

这是因为您尝试将 MapViewControllerType 添加为子视图,而不是 MapViewController 的实际实例的视图。

它可能只会帮助你一点,但如果你这样做了

let mapViewController = MapViewController()
self.view.addSubview(mapViewController.view)

在你想做一些更有趣的事情之前,你可能没问题。

话虽如此,您可能想了解 OO 编程:什么是类,什么是实例,......

【讨论】:

好的,感谢您的提示。但我不能 100% 确定我将在哪里实施这些代码。 代替不编译的行。顺便说一句,您可能已经注意到如何在 viewDidLoad 方法实现中将视图添加为子视图的工作示例。【参考方案2】:

编辑:

首先,不要将你的班级命名为MapViewController。那已经是一种视图控制器,所以你应该自己命名(我将其称为JLMapView,使用我的首字母缩写)。由于您尝试将MapViews 添加到单元格中,因此您也不应该继承UIViewController 的形式。相反,只需让您的 JLMapView 继承自 UIView

因此,您的类声明应如下所示:

class JLMapView: UIView 
//etc..

试试这个MapCell1

class MapCell1: MapCell, MKMapViewDelegate 
     var mapView = JLMapView()
     override func setupViews() 

    backgroundColor = UIColor.blueColor()

    addSubview(mapView)

这样,您将添加JLMapView 的实例。您最初在 addSubviews 中拥有类类型,这让 Swift 感到困惑,因为它不能添加对象类型,它需要对象的特定实例。这就像去汽车经销商处,而不是要求一辆 SUV 或轿车或这辆车或那辆车,你要求一个“汽车”作为一个想法。如果您仍然感到困惑,请认真考虑查看面向对象的编程概念,特别是 data modeling

祝你好运,如果还是不行,请告诉我们原因

结束编辑

如果我正确阅读了问题,那么您正在尝试将视图控制器类型添加为子视图,而您不能这样做。您应该发送视图的实例,而不是对象的类型。如果您不明白,那是一个单独的问题,您应该使用 OOP 概念,例如 what an object is vs what an object type is。不幸的是,我不知道您要做什么,因此我无法提供完整的解决方案。

你的MapCells 是什么?他们应该是UITableViewCells 吗?您是否尝试将 MapViews 添加到单个单元格?

请详细说明,我会进一步帮助您

【讨论】:

是的,我正在尝试在单个单元格中添加 MapView。这是一个 UICollectionViewCell【参考方案3】:

MapViewController 是控制器类型。当您键入“MapViewController”时,就像键入“Int”一样。您指的是类型,而不是它的特定版本。

想象一下,如果我说

let a = 3 + Int

你不想知道 Int 加到 3 上吗?在这个类比中,你想添加一个控制器视图的实例

另外,我很好奇你为什么不想使用 Storyboard

【讨论】:

是的,我知道它为什么不起作用。我忘了提那个。我在youtube上看到一个教程没有使用Storyboard,忘记是什么原因在哪里。但我只是在尝试不同的东西,我也使用了一点 Storybard... 我明白了。正如imak 所说,在这种情况下,您需要创建一个控制器实例,然后将其视图添加为子视图 好的,我用谷歌搜索了一下,但我不知道在哪里可以写出阿玛克写的这些代码。 在 setupViews() 中,将 addSubview(MapViewController) 替换为 let mapViewController = MapViewController() self.view.addSubview(mapViewController.view)。您需要了解为什么会这样或将来的工作会很困难 好的,我实现了这些代码我得到一个新的错误:'MapCell1'类型的值没有成员'view'

以上是关于无法将类型“(MapViewController).Type”(又名“MapViewController.Type”)的值转换为预期的参数类型“UIView”的主要内容,如果未能解决你的问题,请参考以下文章

无法更改图钉 iOS MapKit 的颜色

从 MapViewController 调用 UINavigationController

无法通过 Corelocation 找到位置

如何将双精度值从 json 转换为函数

如何设置 UIImageView 控制器目标 c 的背景图像?

UIButton addTarget 在不同的 ViewController