2016-09-12 10 views
7

Ponieważ Eureka służy do tworzenia nowego rekordu, który zawiera różne typy danych, z których jeden to MediaPicker, zastanawiam się, jak zaprezentować jego viewController.Jak wyświetlić viewController za pomocą wiersza w formularzach Eureka

Który wiersz wykona zadanie? PushRow lub ButtonRow

Oto moja klasa, gdzie staram się stworzyć to.

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

Poniżej znajduje się błąd, z którym się spotykam.

Error

+0

@EricAya Cóż, właściwie nie. Jestem całkowicie nowy w rozwoju iOS. I Eureka wydaje się być bardzo dobrym szkieletem, jeśli chodzi o formy. Używam więc mojej aplikacji. Ale gdy istnieje niestandardowa implementacja, nie jestem w stanie powiązać jej poprawnie. Co zasugerowałbyś w tym przypadku? Dzięki ... – Shyam

+0

Zrobiłem to również. Błąd zgłaszany jest, nie może powoływać się inicjator dla typu „AddMusicViewController” z listy argumentów typu „((_) -> _)” – Shyam

+0

Hi Shyam, chcę przedstawić GooglePlaces autouzupełniania ViewController sprawie wyboru rzędu (https: //developers.google.com/places/ios-api/autocomplete) czy możliwe jest użycie twojego kodu? – Annjawn

Odpowiedz

5

Mimo, że był to pytanie ogólne, mój wymogiem było użycie MPMediaPickerController.

Poniżej znajduje się moja konfiguracja.

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

Uważam, że nie jest trudno dostosować go do osobistych wymagań!

+0

Mimo, że udało mi się przedstawić kontroler viewcontroller, nadal nie jestem w stanie odebrać wartości, która będzie wyświetlana, gdy cofnę się do rzędu !! Czy ktoś ma jakieś sugestie? – Shyam

+1

Właściwie to udało mi się z pomocą twórców Eureki. row.value = musicTemp! (Usunięcie znaku zapytania, zmyślił) :) – Shyam

+0

To odpowiada "pokaż", ale robienie "pokazu" z "kontrolera widoku formularza" często oznacza, że ​​naprawdę chcesz "wepchnąć" do stosu nawigacji, w którym to przypadku musiałbyś przesłonić metodę "show (...)" na podklasie FormViewController i powiedz jak self.navigationController? .push (...) – snakeoil

Powiązane problemy