2017-07-12 1 views
0

J'essaie d'étendre une fonction dans mon contrôleur de vue principal (func getCityWeatherData) à la classe ci-dessous qui affiche uniquement les éléments définis dans certaines conditions.Swift3: Appeler les données de func du VC principal à TableVC pour les cellules conditionnelles

J'ai également marqué des données d'échantillon qui ont des critères à sélectionner - comment les séparer du tableau habituel? J'ai essayé ce que j'ai lu ailleurs, dans la section numberOfRowsAt, mais je suis confus.

class ProductRecsTableViewController: UITableViewController { 

//Mark: Properties 

var products = [Product]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

// MARK: - Table view data source 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if getCityWeatherData.humidity < 50 { 
     return productsHumidity.count 
    } else { 
    return products.count 
    } } 

C'est une cellule d'exemple que j'ai créé - Je veux que le « temps ... », mais de définir quand les émissions de poste.

guard let prod1 = Product(name: "XXX", photo: photo1, rating: 1, weather: "Humidity") 
+0

il est source de confusion, s'il vous plaît expliquer le problème en détail à nouveau – D4ttatraya

+0

@ D4ttatraya J'ai données à partir d'un API de temps dans 'ViewController', mais j'ai aussi besoin d'y accéder dans' ProductRecsTableViewController'. Comment je fais cela –

+0

@ J.M. Vous devriez envisager de séparer l'accès à votre API météo dans son propre objet Modèle. Si vous mettez tout le poids de l'accès réel aux données de l'API, vous pouvez faire quelque chose comme 'let weatherApi = WeatherApi(), laissez currentWeather = weatherApi.getWeather()'. Votre contrôleur devrait être responsable d'obtenir des données du modèle et de le donner à la vue. Toutefois, de nombreux contrôleurs peuvent partager un seul modèle, ce qui vous aidera à résoudre le problème actuel de réutilisation d'une fonction sur deux contrôleurs de vue. –

Répondre

0

On dirait que vous essayez d'accéder à une fonction appelée getCityWeatherData de votre ProductRecsTableViewController classe, que vous ne pouvez pas le faire, sauf si vous avez un certain type de relation entre les deux contrôleurs. Vous pouvez créer un protocole appelé ProductRecsTableViewControllerDelegate: AnyObject qui a une seule fonction qui renvoie à votre ProductRecsTableViewController les informations dont vous avez besoin. De toute façon, il semble que vous ayez juste besoin de transmettre des données/informations entre deux contrôleurs soit par délégation, soit par propriétés.

MISE À JOUR: # 2

class CustomViewController: UIViewController, CustomDelegate { 
    func askForData() -> Data { 
     return _whateverDataYouWant 
    } 
} 

protocol CustomDelegate: AnyObject { 
    func askForData() -> Data 
} 

class ProductRecsTableViewController: UITableViewController { 
    weak var delegate: CustomDelegate? 

    func myMethodThatNeedsAccessToData() { 
     let data = delegate?.askForData() 
     doStuffWith(data) 
    } 

} 

à un moment donné dans ce processus, vous devez dire myProductsRectsTableViewController.delegate = self dans votre ViewController

+0

Je lisais sur l'utilisation de la délégation ou des protocoles, mais pour une raison quelconque, j'ai du mal à comprendre. Je vais vérifier avec le 'délégué: anyObject' que vous avez donné –

+0

vérifier ma mise à jour ci-dessus ~ – cloudcal

+1

Merci, cela aide à expliquer le processus de protocole un peu plus. –