从 Textfield.inputview 加载 xib UIView

Posted

技术标签:

【中文标题】从 Textfield.inputview 加载 xib UIView【英文标题】:load xib UIView from Textfield.inputview 【发布时间】:2015-04-20 10:32:54 【问题描述】:

我有一个带有 UIPickerView 和完成按钮的自定义 xib (UIView)。

我正在尝试将其加载为文本字段的输入视图。

如果我将 xib 作为 UIView 并有 UIView Class.swift 文件,我不知道将 NSBundle 放在哪里...以将 swift 文件与 xib 相关联

如果我将 xib 设为 UIViewController 并拥有 UIViewController.swift,我可以将两者关联起来(或者我认为是这样),但在我的主 viewcontroller.swift 中,我的 textfield.inputview 不会将 UIViewController 的实例作为输入视图(可能是因为它不是 UIView)。

我是 swift 编程的新手,但仍在尝试以编程方式找出 xib、故事板和编写视图/按钮等。

我可以通过以编程方式定义视图、向该视图添加 UIPicker 和按钮并将操作分配给按钮 (view.EndEditing = true) 来执行我想要的操作,然后我可以将其设置为输入视图,但我会喜欢通过 xib 来做,所以我可以更轻松地设置自动布局。

这里是 UIViewController 版本:

pickWithDoneViewController.swift

import UIKit

class pickerWithDoneViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource 

  @IBOutlet weak var floorPicker: UIPickerView!
  var myArray = ["1","2","3","4","5","6"]

  //INITIAL METHODS
  override func viewDidLoad() 
    super.viewDidLoad()
    NSBundle.mainBundle().loadNibNamed("pickerWithDoneViewController", owner: self, options: nil)
  

  override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
  

  // PICKER METHODS
  func numberOfComponentsInPickerView(floorPicker: UIPickerView) -> Int 
    return 1
  

  func pickerView(floorPicker: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
    return myArray.count
  

  func pickerView(floorPicker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! 
    return myArray[row]
  

  // BUTTON METHODS
  @IBAction func floorPickerDone(sender: AnyObject) 
    view.endEditing(true)
  

pickerWithDoneViewController.xib:

主视图控制器.swift

class ViewController: UIViewController 

  @IBOutlet weak var floorPickerTextField: UITextField!
  let pickerInputView = pickerWithDoneViewController()

  override func viewDidLoad() 
    super.viewDidLoad()
    floorPickerTextField.inputview = pickerInputView
    //***ERROR***:  Cannot assign a value of type 'pickerWithDoneViewController to a value of type UIView?
  
  override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
  

感谢您的关注,如果我犯了简单的错误,我们深表歉意。我正在尝试通过编码来学习。

【问题讨论】:

您无法将 oneView 加载到另一个视图中,即您无法将 xib 文件内容加载到主故事板 UIView 中。此外,Xib 文件内容仅在应用程序的生命周期内执行,直到它终止。 @Rizwan 您的意思是您不能将 uiview xib 添加到另一个 uiview 中吗?因为我认为您可以在情节提要中(将一个视图绘制到另一个视图中)或以编程方式(self.view.addSubview(v1),v1.addSubview(v2),v2.addSubview(v3)将uiviews添加为uiviews的子视图。 )... 【参考方案1】:

您可以在单个故事板(Viewcontroller 类)中添加任意数量的视图。但是您不能将一个 ViewController 加载到另一个 ViewController 中,因为 swift 仅支持 single inheritance。 在你的代码中

let pickerInputView = pickerWithDoneViewController()

在这一行你想创建一个类的实例,它也扩展了 UIViewController 类,使其成为多重继承

【讨论】:

以上是关于从 Textfield.inputview 加载 xib UIView的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 的 InputAccessoryView 在旋转时消失

在全局范围内将自定义输入视图设置为所有textFields的最简单方法

将自定义输入视图设置为全局所有文本字段的最简单方法

UITextField 离开光标,移除键盘

Swift - 如何在文本字段之外点击后关闭数字键盘

点击按钮时显示 UIPickerView