Swift 中的第一个 iOS 应用程序 - UIPickerView 中的问号

Posted

技术标签:

【中文标题】Swift 中的第一个 iOS 应用程序 - UIPickerView 中的问号【英文标题】:First iOS app in Swift - Question marks in UIPickerView 【发布时间】:2015-04-22 22:19:20 【问题描述】:

我正在开发我的第一个 Swift ios 应用程序。

无法从 pickerData 获取数据到我的选取器中,但我只得到问号而不是实际值。我想这与委托有关,但不确定是什么问题。

import UIKit
import CoreData

class NewWorkoutController: UIViewController,UIPickerViewDelegate, UIPickerViewDataSource 

@IBOutlet weak var workoutDistance: UITextField!

let pickerData = ["11","12","13","14","15"]

// Data Sources
func numberOfComponentsInPickerView(distancePickerView: UIPickerView) -> Int 
    return 1

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

// Delegates
func pickerViewReturnRow(distancePickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! 
    return pickerData[row]

func pickerViewText(distancePickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    workoutDistance.text = pickerData[row]

func doneDistancePicker() 
    workoutDistance.resignFirstResponder()

func cancelDistancePicker() 
    workoutDistance.resignFirstResponder()


@IBAction func textFieldDistanceEditing2(sender: UITextField) 

    // Create picker view
    var distancePickerView: UIPickerView
    distancePickerView = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 300))
    distancePickerView.backgroundColor = .whiteColor()

    distancePickerView.showsSelectionIndicator = true
    distancePickerView.delegate = self
    distancePickerView.dataSource = self

    // Create toolbar
    var toolBar = UIToolbar()
    toolBar.barStyle = UIBarStyle.Default
    toolBar.translucent = true
    toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
    toolBar.sizeToFit()

    // Create buttons
    var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "doneDistancePicker")
    var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelDistancePicker")

    // Assign buttons to toolbar
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
    toolBar.userInteractionEnabled = true

    // Add pickerview and toolbar to textfield
    workoutDistance.inputView = distancePickerView
    workoutDistance.inputAccessoryView = toolBar

    sender.inputView = distancePickerView


override func viewDidLoad() 
    super.viewDidLoad()


【问题讨论】:

【参考方案1】:

这个函数的签名是错误的:

func pickerViewReturnRow(distancePickerView: UIPickerView, 
    titleForRow row: Int, 
    forComponent component: Int) -> String!

应该是

func pickerView(pickerView: UIPickerView,
    titleForRow row: Int,
    forComponent component: Int) -> String!

因此,该方法(为您的选择器中的行提供标题)没有被调用。

【讨论】:

啊,哦,ReturnRow 是用于单元格的,复制粘贴不好:(非常感谢! 可选委托方法的一个问题是,如果您弄错了方法名称,则对象不会默默地调用该方法。这会使调试变得困难。永远记得检查你的方法名称,然后设置一个断点(或插入一个 println)并确保你的方法真的被调用了。 自动完成可以帮助获得正确的方法名称。一旦你声明你的类符合协议,协议的所有方法都会尝试自动完成,即使是可选的。【参考方案2】:

在所有 pickerView 委托方法的签名中,您将 pickerView 替换为您的 pickerView 出口,即 distancePickerView,这不是必需的。您应该修改委托方法体内的代码,因为如果我们将您的 pickerView delegatedatasource 确认到您的 ViewController 类,则 swift 编译器会自动调用委托方法通过将代码编写为:

pickerViewOutlet.delegate = self
pickerViewOutlet.dataSource = self

因此,只需使用其默认签名修改所有 pickerView 委托方法,然后编译器将调用它并在其中显示数据。

【讨论】:

以上是关于Swift 中的第一个 iOS 应用程序 - UIPickerView 中的问号的主要内容,如果未能解决你的问题,请参考以下文章

如何正确设置 Core Data Stack 到 iOS 和 Swift 中的第一个视图控制器?

下拉以在 swift UI 中刷新数据

组织我的第一个 iOS 应用程序的 UI

Swift 中的 Xcode:导航栏未显示在 UI 集合视图(模拟器)中

关于属性值 iOS/Swift 的 UI 测试

iOS/Swift:用于 UI 测试的“没有这样的模块...”