我似乎无法找到一个外部类管理ViewController中的视图的连接.我是iOS的新手,并且花了很多时间寻找解决方案.简单示例:

UIPickerView的子类

我创建了一个文件,它是UIPickerView的子类,并使其符合PickerView委托和数据源.

class MyPickerView: UIPickerView,UIPickerViewDelegate,UIPickerViewDataSource {
    //In here I conform to all the required methods...no problems there
}

主视图控制器,带PletView的插座

在我的MainViewController中,我为我的选择器视图创建了一个插座.另外,在StoryBoard中,我将我的Picker View的“自定义类”连接到上面的MyPickerView.

class MainViewController: UIViewController {
    @IBOutlet weak var myPickerView: UIPickerView!

    override func viewDidLoad() {
        //how do I hookup my picker view class
    }
}

我的问题:

>如何告诉我的MainViewController我的子类“MyPickerView”正在管理它的选择器视图?
>我如何启用子类和视图控制器之间的通信?

———————

更新:最终解决方案纳入@ Oscar的答案

@ Oscar的建议很棒.为了澄清,我希望我的PickerView子类是UIPickerView Delegate,因为Picker将始终具有相同的UI,并且有许多用于UI的PickerView委托方法. (attributionTitleForRow,widthForComponent,rowHeightForComponent等)我不想在每个使用此PickerView的ViewController中调用这些委托方法.

现在,当调用PickerView“didSelectRow”时,我们需要通知我们的ViewController并传递所选的值.为了实现这一点,我使用了一个协议. (总结如下)这个主题花了我一些时间来学习,但是至关重要,所以我建议花时间与Protocols&代表团,如果这没有意义.

>在PickerView中创建一个带有func的协议,该func将用于与呈现此PickerView的ViewControllers对话:

protocol MyPickerViewProtocol {
    func myPickerDidSelectRow(selectedRowValue:Int?)
}

>在呈现PickerView的ViewController中,符合您的PickerView协议.通过这样做,您必须将func myPickerDidSelectRow放在ViewController中的某个位置:

class MyViewController: MyPickerViewProtocol {
    func myPickerDidSelectRow(selectedRowValue:Int?) { 
        //do stuff to update your ViewController 
    }
}

> @ Oscar的答案将把选择器视图连接到你的视图控制器,但还有最后一件事.为了让PickerView能够进行对话,您需要在PickerView中使用一个属性,它是对它所包含的视图控制器的引用.以下是PickeView和ViewController类的透视图:

//PickerView Subclass ------------------
protocol MyPickerViewProtocol {
    func myPickerDidSelectRow(selectedRowValue:Int?)
}

class MyPickerView: UIPickerView {
    //Note: this var is of type your Picker protocol above. Because the ViewController will conform to the protocol,this var will be the reference (or the pointer) to the protocol func you implement in your ViewController...which is myPickerDidSelectRow
    var propertyThatReferencesThisViewController:MyPickerViewProtocol?
}        

//ViewController Class ----------------
myPicker = MyPickerView()
myPickerView.dataSource = myPicker //note: myPickerView is the outlet of type UIPickerView in your ViewController
myPickerView.delegate = myPicker
//HERE'S THE PROPERTY from our PickerView subclass that will point to this ViewController's protocol methods that we implemented. From the MyPickerViewProtocol
myPicker.propertyThatReferencesThisViewController = self

>现在当我们的PickerView中选择了一行时,让我们使用我们的属性告诉ViewController:propertyThatReferencesThisViewController

class MyPickerView: UIPickerView {
    //This Property points to the ViewController conforming to the protocol. This property will only be able to access the stuff you put in the protocol. It won't access everything in your ViewController
    var propertyThatReferencesThisViewController:MyPickerViewProtocol?

    //didSelectRow UIPickerView Delegate method that apple gives us
    func pickerView(pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int) {
        //get your picker values that you need
        let theRowValue = someArray[row]
        propertyThatReferencesThisViewController?.myPickerDidSelectRow(theRowValue)

        //the ViewController func will be called passing the row value along
    }
}

解决方法

子类Pickerview
class MyPickerView: UIPickerView,UIPickerViewDataSource,UIPickerViewDelegate {

    var oficinas = ["oficina 1","Oficinas 2","Oficina 3"]

    func pickerView(pickerView: UIPickerView,numberOfRowsInComponent component: Int) -> Int {
        return oficinas.count
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(pickerView: UIPickerView,titleForRow row: Int,forComponent component: Int) -> String? {
        return oficinas[row]
    }
}

主视图控制器,带PletView的插座

class MainViewController: UIViewController {
    @IBOutlet weak var myPickerView: UIPickerView!

    var pickerOficinas: MyPickerView!

    override func viewDidLoad() {
        //how do I hookup my picker view class
        pickerOficinas = MyPickerView()
        myPickerView.delegate = pickerOficinas
        myPickerView.dataSource = pickerOficinas
    }
}

ios – 从外部类管理UIPickerView – 使用Swift的更多相关文章

  1. ios – 将图像图标添加到UIPickerView行

    我看了看网上的内容并没有找到太多!我想知道你如何将图像放在UIPicker中,以便每个行都有不同的图像.解决方法

  2. ios – 减少UIPickerView组件之间的空间

    我想减少UIPickerView中不同组件之间的空间.实际上我想构建一个类似于iPhone手表中的Timer的选择器视图.我相信有4个组成部分.首先是小时组件(0,1,2…….59),第四个是小组件.如何增加小时和分钟组件之间的比较空间.我不想在每小时值和每分钟值使用小时和分钟.解决方法您必须使用widthForComponent委托方法.以下是Swift的一个例子.找到objective-c等价物.

  3. UIPickerView具有iOS7中的自定义视图

    我有一个带有UIPickerView的应用程序.我使用该方法返回自定义视图它在iOS6中看起来很好.在iOS7中,没有太多的屏幕截图如下.请注意,在没有焦点的单元格中,第二列和第三列重叠.中央排是正确的.有什么建议么?解决方法看来,出于奇怪的原因,如果任何列的宽度都高于选择器视图宽度的1/3,则布局会中断.所以如果你有一个320像素宽的选择器视图106或更少正在工作,但是107或更高版本是错误的,无论你是否有2,3,4…

  4. iOS – 填充静态UIPickerView

    我有一个配置文件表单作为iOS应用程序注册过程的一部分.我想使用一个“下拉”菜单,如性别,标题,dob等项目.每个数据将是静态的–我将使用UIPickerView实现–但我的问题是–我需要创建数组和数据委托来填充每个单独的选择器,还是有一个更简单的方法来应用静态数据?解决方法没有代表你可以做吗?

  5. ios – 以编程方式创建和显示UIPickerView

    我试图以编程方式创建UIPickerView并将其显示为文本字段的firstResponder,但是,选择器视图未显示.textField连接到接口构建器中的对象,但是正在以编程方式创建pickerView.为什么我在运行应用程序时看不到这个pickerView?

  6. ios – 从外部类管理UIPickerView – 使用Swift

    我似乎无法找到一个外部类管理ViewController中的视图的连接.我是iOS的新手,并且花了很多时间寻找解决方案.简单示例:UIPickerView的子类我创建了一个文件,它是UIPickerView的子类,并使其符合PickerView委托和数据源.主视图控制器,带PletView的插座在我的MainViewController中,我为我的选择器视图创建了一个插座.另外,在StoryBoard中,我将我的PickerView的“自定义类”连接到上面的MyPickerView.我的问题:>如何告诉我

  7. swift UI专项训练15 PcikerView老虎机视图

    在storyboard中拖拽一个pickerview,显示如下:pickerView是没法选择默认值的,图中的几个字符都是和苹果相关的地名,如要设置我们只能去代码中设置。分别拖拽到控制器中建立联系:然后回到storyboard中,选中pickerview,把右侧的outlets与viewcontroller连接起来:那么数据从哪来呢,我们回到代码中,首先依旧需要手动把继承的协议加上:加上之后你会发现会报错,那是因为你光继承却没有实现它的回调方法,就像tableView一样,如果控制器继承了数据源,那么就必

  8. Swift 简单控件示例:选择器UIPickerView

    转载请声明出处:http://www.jb51.cc/article/p-bwzyycke-ga.html---------------------------------------------------------------------------------------------------------------------------------------------------

  9. UI基础控件 Swift

  10. 使用UIPickerView实现简单的城市选择器

    UIPickerView是apple提供的选择器控件,可以根据业务需求生成单列或多列的选择器.下面举例实现一个”省份-城市”联动的两列选择器.查看源码(oc+swift)效果图数据源格式因为只是一个简单的示例,所以在网上随便找了一个plist文件,数据格式截图如下:实现思路与UITableView一样,UIPickerView需要开发者实现其UIPickerViewDataSource和UIPic

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部