如何在 Eureka Forms 中使用一行来呈现 viewController
How to present a viewController using a row in Eureka Forms
由于 Eureka 用于创建新记录,其中包括不同的数据类型,其中一种是 MediaPicker
,我想知道如何呈现它的 viewController。
哪一行可以完成这项工作? PushRow
或 ButtonRow
这是我的 class 我尝试创建它的地方。
import UIKit
import MediaPlayer
import Eureka
public final class MusicRow<T: Equatable> : SelectorRow<T, PushSelectorCell<T>, SelectorViewController<T>>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
presentationMode = .Show(controllerProvider: ControllerProvider.Callback {
return AddMusicViewController(){ _ in }
}, completionCallback: { vc in
vc.navigationController?.popViewControllerAnimated(true)
})
}
}
public class AddMusicViewController: MPMediaPickerController, MPMediaPickerControllerDelegate {
var musicPicker: MPMediaPickerController!
public var row: RowOf<MPMediaItemCollection>!
public var completionCallback : ((UIViewController) -> ())?
public override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// Setup sections/rows for tableView
addMusic()
}
// Initialize musicPicker and customize it
func addMusic() {
musicPicker = MPMediaPickerController.self(mediaTypes:.Music)
musicPicker.delegate = self
musicPicker.allowsPickingMultipleItems = true
view.addSubview(musicPicker.view)
}
// After selection, store the data into an array
public func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
musicTemp = nil
musicTemp = mediaItemCollection
if musicTemp == nil {
noMusic = true
} else {
noMusic = false
}
completionCallback?(self)
}
// Cancel mediaPickerController
public func mediaPickerDidCancel(mediaPicker: MPMediaPickerController){
// Dismiss the picker if the user canceled
noMusic = true
completionCallback?(self)
}
}
下面是我遇到的错误。
尽管这是一个一般性问题,但我的要求是使用 MPMediaPickerController
。
以下是我的设置。
import UIKit
import MediaPlayer
import Eureka
// MusicRow
public final class MusicRow : SelectorRow<MPMediaItemCollection, PushSelectorCell<MPMediaItemCollection>, AddMusicViewController>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
presentationMode = .Show(controllerProvider: ControllerProvider.Callback { return AddMusicViewController(){ _ in } }, completionCallback: { vc in vc.navigationController?.popViewControllerAnimated(true) })
displayValueFor = {
guard var musicTitle = [=10=] else { return "" }
musicTitle = musicTemp!
let representativeItem = musicTitle.representativeItem
print("representativeItem = \(representativeItem)")
let representativeItemTitle = representativeItem?.title
return "\(representativeItemTitle)"
}
}
}
// MusicViewController
public class AddMusicViewController : UIViewController, TypedRowControllerType, MPMediaPickerControllerDelegate {
public var row: RowOf<MPMediaItemCollection>!
public var completionCallback : ((UIViewController) -> ())?
lazy var musicPicker : MPMediaPickerController = { [unowned self] in
let mediaPicker = MPMediaPickerController.self(mediaTypes:.Music)
return mediaPicker
}()
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nil, bundle: nil)
}
convenience public init(_ callback: (UIViewController) -> ()){
self.init(nibName: nil, bundle: nil)
completionCallback = callback
}
public override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(musicPicker.view)
musicPicker.delegate = self
musicPicker.allowsPickingMultipleItems = true
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}
// After selection, store the data into a temporary variable
public func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
musicTemp = nil
musicTemp = mediaItemCollection
if musicTemp == nil {
noMusic = true
} else {
noMusic = false
row.value? = musicTemp!
}
completionCallback?(self)
}
// Cancel mediaPickerController
public func mediaPickerDidCancel(mediaPicker: MPMediaPickerController){
// Dismiss the picker if the user canceled
noMusic = true
completionCallback?(self)
}
}
我相信,根据任何人的个人需求调整它并不难!
由于 Eureka 用于创建新记录,其中包括不同的数据类型,其中一种是 MediaPicker
,我想知道如何呈现它的 viewController。
哪一行可以完成这项工作? PushRow
或 ButtonRow
这是我的 class 我尝试创建它的地方。
import UIKit
import MediaPlayer
import Eureka
public final class MusicRow<T: Equatable> : SelectorRow<T, PushSelectorCell<T>, SelectorViewController<T>>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
presentationMode = .Show(controllerProvider: ControllerProvider.Callback {
return AddMusicViewController(){ _ in }
}, completionCallback: { vc in
vc.navigationController?.popViewControllerAnimated(true)
})
}
}
public class AddMusicViewController: MPMediaPickerController, MPMediaPickerControllerDelegate {
var musicPicker: MPMediaPickerController!
public var row: RowOf<MPMediaItemCollection>!
public var completionCallback : ((UIViewController) -> ())?
public override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// Setup sections/rows for tableView
addMusic()
}
// Initialize musicPicker and customize it
func addMusic() {
musicPicker = MPMediaPickerController.self(mediaTypes:.Music)
musicPicker.delegate = self
musicPicker.allowsPickingMultipleItems = true
view.addSubview(musicPicker.view)
}
// After selection, store the data into an array
public func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
musicTemp = nil
musicTemp = mediaItemCollection
if musicTemp == nil {
noMusic = true
} else {
noMusic = false
}
completionCallback?(self)
}
// Cancel mediaPickerController
public func mediaPickerDidCancel(mediaPicker: MPMediaPickerController){
// Dismiss the picker if the user canceled
noMusic = true
completionCallback?(self)
}
}
下面是我遇到的错误。
尽管这是一个一般性问题,但我的要求是使用 MPMediaPickerController
。
以下是我的设置。
import UIKit
import MediaPlayer
import Eureka
// MusicRow
public final class MusicRow : SelectorRow<MPMediaItemCollection, PushSelectorCell<MPMediaItemCollection>, AddMusicViewController>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
presentationMode = .Show(controllerProvider: ControllerProvider.Callback { return AddMusicViewController(){ _ in } }, completionCallback: { vc in vc.navigationController?.popViewControllerAnimated(true) })
displayValueFor = {
guard var musicTitle = [=10=] else { return "" }
musicTitle = musicTemp!
let representativeItem = musicTitle.representativeItem
print("representativeItem = \(representativeItem)")
let representativeItemTitle = representativeItem?.title
return "\(representativeItemTitle)"
}
}
}
// MusicViewController
public class AddMusicViewController : UIViewController, TypedRowControllerType, MPMediaPickerControllerDelegate {
public var row: RowOf<MPMediaItemCollection>!
public var completionCallback : ((UIViewController) -> ())?
lazy var musicPicker : MPMediaPickerController = { [unowned self] in
let mediaPicker = MPMediaPickerController.self(mediaTypes:.Music)
return mediaPicker
}()
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nil, bundle: nil)
}
convenience public init(_ callback: (UIViewController) -> ()){
self.init(nibName: nil, bundle: nil)
completionCallback = callback
}
public override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(musicPicker.view)
musicPicker.delegate = self
musicPicker.allowsPickingMultipleItems = true
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}
// After selection, store the data into a temporary variable
public func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
musicTemp = nil
musicTemp = mediaItemCollection
if musicTemp == nil {
noMusic = true
} else {
noMusic = false
row.value? = musicTemp!
}
completionCallback?(self)
}
// Cancel mediaPickerController
public func mediaPickerDidCancel(mediaPicker: MPMediaPickerController){
// Dismiss the picker if the user canceled
noMusic = true
completionCallback?(self)
}
}
我相信,根据任何人的个人需求调整它并不难!