【问题标题】:[UILabel numberOfComponentsInPickerView:]: unrecognized selector sent to instance ...][UILabel numberOfComponentsInPickerView:]: unrecognized selector sent to instance ...]
【发布时间】:2015-09-11 11:39:25
【问题描述】:

在我的 iOS 应用程序中,我创建了一个带有自定义单元格的表格视图控制器,其中一个单元格包含一个 PickerView。这是该自定义单元格的类:

 import Foundation
 import UIKit

class PickerCell: UITableViewCell {
  @IBOutlet weak var label : UILabel!
  @IBOutlet weak var pickerView : UIPickerView!

func configurePickerCell(labelText:String, pickerDelegate:MyPickerViewController, enabled:Bool, defaultValueIndex:Int) {
    self.label.text = labelText

    var labelFrame:CGRect = self.label.frame
    labelFrame.size.height = Settings.labelHeight
    self.label.frame = labelFrame

    self.pickerView.delegate = pickerDelegate
    self.pickerView.dataSource = pickerDelegate

    if (enabled) {
        self.pickerView.userInteractionEnabled = true
    }

    else {
        self.pickerView.userInteractionEnabled = false
        self.pickerView.selectRow(defaultValueIndex, inComponent: 0, animated: true)
    }
}
}

这里是选择器视图控制器类:

import Foundation
import UIKit
class MyPickerViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {

var pickerData:[String]!

init(pickerData: [String]){
    super.init(nibName: nil, bundle: nil)
    self.pickerData = pickerData
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    fatalError("init(coder:) has not been implemented")
}

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

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

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

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    println(self.pickerData[row])
}
}

并且是我的表格视图控制器中的一对方法:

override func viewWillAppear(animated: Bool) {
    self.tabBarController?.navigationItem.leftBarButtonItem = nil
    self.tabBarController?.navigationItem.setHidesBackButton(false, animated: true)

    self.projectService.requestAllProjects {
        (response) in
        self.projects = self.projectService.loadProjects(response) as! [Project]
        //println(self.projects.count)
        dispatch_async(dispatch_get_main_queue()) {
            self.tableView.reloadData()
        }
    }

    self.userService.requestAllUsers {
        (response) in
        self.users = self.userService.loadUsers(response) as! [User]
        //println(self.users.count)
        dispatch_async(dispatch_get_main_queue()) {
            self.tableView.reloadData()
        }
    }

}

虽然这是在内部调用的

 override func tableView(tableView: UITableView,
    cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

       ...

        self.projectCell = tableView.dequeueReusableCellWithIdentifier("PickerCell", forIndexPath: indexPath) as! PickerCell
        let pickerController = MyPickerViewController(pickerData: self.projectService.getArrayOfNames(self.projects))
        self.projectCell.configurePickerCell("Progetto", pickerDelegate: pickerController, enabled: true, defaultValueIndex: 0)
        return self.projectCell

     ...
}

问题是我得到了标题错误,我不知道它是什么意思。 self.projects 是从数据库中检索到的一组 Project 对象

NSURLSession.sharedSession().dataTaskWithURL()

并且它被正确填充,所以我不知道我在哪里犯了错误。 你能帮忙吗?

更新 非常感谢@NickCatib,这是我的工作代码。 注意:不需要其他类作为 Picker 视图委托。我刚刚在自定义单元格中实现了它:

import Foundation
import UIKit

class PickerCell: UITableViewCell, UIPickerViewDataSource,UIPickerViewDelegate {
  @IBOutlet weak var label : UILabel!
  @IBOutlet weak var pickerView : UIPickerView!

  var pickerData:[String]!

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

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

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

  func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    println(self.pickerData[row])
  }

  func configurePickerCell(labelText:String, enabled:Bool, defaultValueIndex:Int) {
    self.label.text = labelText

    var labelFrame:CGRect = self.label.frame
    labelFrame.size.height = Settings.labelHeight
    self.label.frame = labelFrame

    self.pickerView.delegate = self
    self.pickerView.dataSource = self

    if (enabled) {
        self.pickerView.userInteractionEnabled = true
    }

    else {
        self.pickerView.userInteractionEnabled = false
        self.pickerView.selectRow(defaultValueIndex, inComponent: 0, animated: true)
    }
  }
}

【问题讨论】:

  • 是 MyPickerViewController 中的 cellForRowAtIntexPath 吗?
  • 不,它在表格视图控制器内部。应该把它放在 MyPickerView 控制器中吗?怎么样?
  • 对不起...我是新手,总体而言是选择器视图:S
  • 好吧,我会在 tableview 控制器或单元格本身中为选取器视图设置委托。基本上我认为处理 UIPicker 的这些变化的最好方法是马上,所以尝试在单元格或 UITableViewController 内实现委托。由于有多个选择器的变化,我会在这个特殊情况下在单元格内处理它们。
  • 我会发布这个作为答案。所有的 tableview 委托一个数据源方法被调用每个你调用 reloaddata,所以当你得到你的数据 relod 表时,就是这样。是的,这些方法是在 virw willappear 之后调用的

标签: ios swift uitableview uipickerview unrecognized-selector


【解决方案1】:

我会在tableView 控制器或单元格本身中为选择器视图设置委托。基本上我认为处理UIPicker 的这些变化的最好方法是马上,所以尝试在单元格内实现delegateUITableViewController。由于有机会拥有多个选择器,因此对于这种特殊情况,我会在单元格内处理它们。

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多