2016-09-12 12 views
7

ユーレカは異なるデータ型を含む新しいレコード(MediaPicker)を作成するために使用されるため、viewControllerの表示方法が不思議です。ユーレカフォームの行を使用してviewControllerを表示する方法

ジョブを実行する行はどれですか? PushRowまたはButtonRow

これは私がこれを作成しようとする私のクラスです。

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) 
    } 
} 

以下は、私が直面しているエラーです。

Error

+0

@EricAyaまあ、実際にはありません。私はiOS開発に全く新しいです。そして、ユーレカはフォームに関しては非常に良いフレームワークと思われます。だから、私は自分のアプリを使用します。しかし、カスタム実装がある場合、それを正しく関連付けることはできません。この場合、あなたは何をお勧めしますか?ありがとう.. – Shyam

+0

私もそれをしました。私が受け取るエラーは、 '(_ _ - > _)型の引数リストを持つ' AddMusicViewController 'タイプのイニシャライザを呼び出せません。 – Shyam

+0

こんにちはShyam、私は行の選択にGooglePlacesの自動補完ViewControllerを提示したい(https: //developers.google.com/places/ios-api/autocomplete)あなたのコードを使用することは可能ですか? – Annjawn

答えて

5

が、これは私の要件は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 = $0 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) 
    } 
} 

私は誰の個人的な要求にそれを微調整することは困難ではないと信じています!

+0

ViewControllerを表示することはできましたが、私はまだ行に戻ったときに表示される値を受け取ることができません!誰もが何か提案がありますか? – Shyam

+1

まあ、実際に私はユーレカのクリエイターの助けを借りてできました。 row.value = musicTemp! :)質問: – Shyam

+0

これは「ショー」と答えますが、「フォームビューコントローラー」から「ショー」を行うと、ナビゲーションスタックに実際に「押し込む」ことを意味します。 FormViewControllerのサブクラスで "show(...)"メソッドをオーバーライドし、self.navigationController?.push(...)のようにする必要があります。 – snakeoil

関連する問題